程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#中方法重載詳解(2)

C#中方法重載詳解(2)

編輯:關於C語言

首先我們看第一個版本:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved