閱讀914 返回首頁    go 阿裏雲 go 技術社區[雲棲]


關於靜態方法

對於初學OOP的人,靜態方法是個不大不小的問題。在此,做個粗淺說明。

1. 靜態方法是類方法,調用時不需要創建類實例。
2. 靜態方法是靜態綁定到子類,不是被繼承。

為了形象說明,請看下麵的例子。
namespace Test.CUI
{
  class Base
  {
    public Base()
    {
      Console.WriteLine("Base...");
    }

    public void Method()
    {
    }

    public static void StaticMethod()
    {
    }
  }

  class Class1 : Base
  {
    public Class1()
    {
      Console.WriteLine("Class1...");
    }

    static void Test1()
    {
      Class1 o = new Class1();
      o.Method();
    }

    static void Test2()
    {
      Class1.StaticMethod();
    }

    static void Main(string[] args)
    {
    }
  }
}

接下來,我們查看編譯後的IL代碼就會明白其中的奧妙。
.method private hidebysig static void Test1() cil managed
{
 // Code Size: 13 byte(s)
 .maxstack 1
 .locals (
 Test.CUI.Class1 class1)
 L_0000: newobj instance void Test.CUI.Class1::.ctor() // 創建對象實例
 L_0005: stloc.0
 L_0006: ldloc.0
 L_0007: callvirt instance void Test.CUI.Base::Method() // 使用callvirt
 L_000c: ret
}

.method private hidebysig static void Test2() cil managed
{
 // Code Size: 7 byte(s)
 .maxstack 0
 L_0000: call void Test.CUI.Base::StaticMethod() // 使用call
 L_0005: nop
 L_0006: ret
}

CLR提供了2個IL指令來調用方法:call和callvirt。其中call指令根據引用變量的類型(即引用變量的靜態類型、聲明類型)來調用一個方法,而callvirt指令根據引用變量的對象類型(引用變量的動態類型、實際類型)來調用一個方法。 

最後更新:2017-04-02 00:06:29

  上一篇:go 由ANSI C標準咬文嚼字發現滴東東
  下一篇:go [原創]Unlocker加強版技術特征