關於靜態方法
對於初學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)
{
}
}
}
{
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
}
{
// 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
上一篇:
由ANSI C標準咬文嚼字發現滴東東
下一篇:
[原創]Unlocker加強版技術特征
PostgreSQL 空間獨立事件相關性分析 二 - 人車擬合
POJ 3525 二分+半麵相交
我用JS寫的一段創建TABLE,添加行,模煳匹配,根據CHECKBOX刪除內容,創建標題的代碼(刪除完再添加行有計數器的BUG)
NLP 專題論文解讀:從 Chatbot 到 NER | PaperDaily #11
word中插入題注(表1、圖1)
本周進展 將1,2,3,4,5,6,7,8,9天的天氣都存進數據庫了
Web.config詳解
醫療健康大數據服務平台技術架構
【C/C++學院】(2)函數/Lua/數組/惡搞程序(修改桌麵背景,播放音樂)
過去一百年那些“被打臉”的科技預言