1.靜態(tài)的方法在整個應(yīng)用程序其間存儲在內(nèi)存中,速度快齐饮,但占用內(nèi)存.
class A
{
public static string b()
{
return "Hello";
}
}
用法: A.b(); //調(diào)用方便
2.動態(tài)的方法在先聲明類實(shí)例才能調(diào)用類中的方法.
class A
{
public string b()
{
return "Hello";
}
}
用法: A a = new a(); a.b();
3.一般使用頻繁的方法用靜態(tài)方法,用的少的方法用動態(tài)的笤昨。靜態(tài)的速度快祖驱,占內(nèi)存。動態(tài)的速度相對慢些瞒窒,但調(diào)用完后捺僻,立即釋放類,可以節(jié)省內(nèi)存崇裁,可以根據(jù)自己的需要選擇是用動態(tài)方法還是靜態(tài)方法匕坯。
4.靜態(tài)方法主要的問題就是數(shù)據(jù)同步的問題。如果你的靜態(tài)方法的類中不保存私有變量那么什么問題都不會有的拔稳。最好是包要操作的數(shù)據(jù)全部以參數(shù)的方式傳到方法中去
5. 靜態(tài)方法是類方法葛峻,調(diào)用時不需要創(chuàng)建類實(shí)例。
6. 靜態(tài)方法是靜態(tài)綁定到子類巴比,不是被繼承术奖。
為了形象說明,請看下面的例子轻绞。
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() // 創(chuàng)建對象實(shí)例
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指令來調(diào)用方法:call和callvirt铲球。其中call指令根據(jù)引用變量的類型(即引用變量的靜態(tài)類型挺庞、聲明類型)來調(diào)用一個方法,而callvirt指令根據(jù)引用變量的對象類型(引用變量的動態(tài)類型稼病、實(shí)際類型)來調(diào)用一個方法选侨。
7.從面向?qū)ο蟮慕嵌葋砜?
靜態(tài)方法面向的是類的操作,而實(shí)力方法面向的是對象.舉個例子來說
例如動物,是一類,一只貓啦,一條狗啦,都是它的子類的一個對象,這些對象不同的貓和狗可能有不同的消化系統(tǒng),還有行走之類的,所以它們的"爬行"方式可以不同,但是這些動物的死法都是一樣的,那就是心跳停止,對于動物類的設(shè)計(jì)可以考慮這么一個方案:
public static void Kill ( Animal aAnimal)
{
//let the animal stop heart beating
}
對于每個對象的具體實(shí)現(xiàn)方式,由對象來完成.
8.靜態(tài)方法修改的是類的狀態(tài),而對象修改的是各個對象的狀態(tài),這點(diǎn)也是它們重要的區(qū)別
9.類的實(shí)例化調(diào)用是在類的生命周期中存在掖鱼,當(dāng)類沒有了以后,對應(yīng)的實(shí)例也就沒有了援制,對應(yīng)的方法也就沒有了戏挡,靜態(tài)類不然,只要你引用了那個靜態(tài)類的命名空間晨仑,他就會一直存在褐墅,知道你退出系統(tǒng)。