靜態方法和動態方法的區別

來源:互聯網
上載者:User

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.類的執行個體化調用是在類的生命週期中存在,當類沒有了以後,對應的執行個體也就沒有了,對應的方法也就沒有了,靜態類不然,只要你引用了那個靜態類的命名空間,他就會一直存在,知道你退出系統。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.