1.靜態方法在整個應用程式其間儲存在記憶體中,速度快,但佔用記憶體.
class A
{
public static string b()
{
return "Hello";
}
}
用法: A.b(); //調用方便
2.動態方法在先聲明類執行個體才能調用類中的方法.
class A
{
public string b()
{
return "Hello";
}
}
用法: A a = new a(); a.b();
3.一般使用頻繁的方法用靜態方法,用的少的方法用動態。靜態速度快,占記憶體。動態速度相對慢些,但調用完後,立即釋放類,可以節省記憶體,可以根據自己的需要選擇是用動態方法還是靜態方法。
4.靜態方法主要的問題就是資料同步的問題。如果你的靜態方法的類中不儲存私人變數那麼什麼問題都不會有的。最好是包要操作的資料全部以參數的方式傳到方法中去
5. 靜態方法是類方法,調用時不需要建立類執行個體。
6. 靜態方法是靜態繫結到子類,不是被繼承。
為了形象說明,請看下面的例子。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指令根據引用變數的物件類型(引用變數的動態類型、實際類型)來調用一個方法。
7.從物件導向的角度來看:
靜態方法面向的是類的操作,而實力方法面向的是對象.舉個例子來說
例如動物,是一類,一隻貓啦,一條狗啦,都是它的子類的一個對象,這些對象不同的貓和狗可能有不同的消化系統,還有行走之類的,所以它們的"爬行"方式可以不同,但是這些動物的死法都是一樣的,那就是心跳停止,對於動物類的設計可以考慮這麼一個方案:
public static void Kill ( Animal aAnimal)
{
//let the animal stop heart beating
}
對於每個對象的具體實現方式,由對象來完成.
8.靜態方法修改的是類的狀態,而對象修改的是各個對象的狀態,這點也是它們重要的區別
9.類的執行個體化調用是在類的生命週期中存在,當類沒有了以後,對應的執行個體也就沒有了,對應的方法也就沒有了,靜態類不然,只要你引用了那個靜態類的命名空間,他就會一直存在,知道你退出系統。