首先我們看第一個版本:
using System;
大家猜猜這個程序的運行結果是什麼?
using System.Collections.Generic;
using System.Text;
namespace OverrideDemo
{
/// <summary>
/// 說明:本實例用於講 述重載的關系
/// 作者:周公
/// 日期:2008-09-04
/// 首發地址:http://blog.csdn.Net/zhoufoxcn
/// </summary>
class Program
{
static void Main(string[] args)
{
String s = null;
Show(s);
Object o = "123";
Show(o);
}
static void Show(string s)
{
Console.WriteLine ("String");
}
static void Show(Object o)
{
Console.WriteLine("Object");
}
}
}
以下是程序運行 結果:
String
Object
對以上代碼進行分析,我們發現 Show()方法有兩種形式,一種是string類型的參數,一種是object類型參數,在一個類中存 在方法名相同、參數列表不同(參數個數或者參數類型不同)的現象我們稱之為overloading ,即重載。不過這裡的Show()方法的參數比較特殊,因為string類繼承於Object類,也就是 Show()方法的參數存在一種繼承關系。從結果我們可以得出兩點結論:
(1)從String s = null;Show(s);最後調用的是static void Show(string s)這個方法我們可以得出,C#中 方法調用是精確匹配的,也就是s是string類型,雖然string類型繼承自object類型,盡管 static void Show(Object o)也滿足條件,但是方法聲明中static void Show(string s)這 個聲明與s類型的最接近(因為s是string類型,與它最接近),所以執行static void Show (string s),而不執行static void Show(Object o)這個方法。
(2)從Object o = "123"; Show(o);最後調用的是static void Show(Object o)這個方法我們可以得 出,C#中如果存在方法重載,會根據其refrence type(引用類型)來調用對象的方法,而不 是根據instance type(實例類型)來調用。盡管”123”是string類型,但是它 的refrence type是object類型的,所以會調用static void Show(Object o)這個方法而不是 static void Show(string s)。
上面的Main()方法的IL代碼如 下:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代碼大小 24 (0x18)
.maxstack 1
.locals init ([0] string s,
[1] object o)
IL_0000: nop
IL_0001: ldnull
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: call void OverrideDemo.Program::Show (string)
IL_0009: nop
IL_000a: ldstr "123"
IL_000f: stloc.1
IL_0010: ldloc.1
IL_0011: call void OverrideDemo.Program::Show(object)
IL_0016: nop
IL_0017: ret
} // end of method Program::Main