有關靜態方法的一些"謬論"

【轉自】http://www.rainsts.net/article.asp?id=261

 

在論壇上經常看到一些莫名其妙的論點,其中有關靜態方法的就很多。

1. 靜態方法效率比實例方法高……
2. 靜態方法比實例方法佔內存,只有當類型被釋放時才被回收……
3. 多個線程同時調用靜態方法時,返回結果可能不準確……

……

說 實話,我很奇怪爲什麼會有這樣的觀點。首先,無論是靜態方法還是實例方法都是通過類型方法表來查找,然後再去執行的,每次調用都會創建新的臨時堆棧,只要 調用代碼相同,怎麼可能有效率高低之分?如第1種說法,可能是將對象實例化的時間也算進去了。而第2種說法,如果將靜態方法換成靜態字段就正確了。無論是 靜態方法還是實例方法,當調用結束後,其內部臨時變量都會失去引用,自然會被GC在合適的時間回收。如果要等類型釋放才被回收,那麻煩就大了,因爲類型只 有在應用程序域被卸載或者程序關閉時纔會被"釋放",如此下去,程序還能不出問題?至於第3種說法,我們用一個小例子驗證一下。

public class Program
{
  static void Test()
  {
    Console.WriteLine(Thread.CurrentThread.Name + " start...");
    Thread.Sleep(10000);
    Console.WriteLine(Thread.CurrentThread.Name + " end...");
  }

  static void Main(string[] args)
  {
    Thread t1 = new Thread(delegate() { Test(); });
    Thread t2 = new Thread(delegate() { Test(); });

    t1.Name = "t1";
    t2.Name = "t2";

    t1.Start();
    t2.Start();
  }
}


輸出:
t1 start...
t2 start...
t1 end...
t2 end...

通過這個例子,我們要明白,每個線程在執行靜態方法的時候會創建獨立的執行環境,內存中會有多個靜態方法"實例"在同時執行。因此只要方法中不涉及共享數據,是不會出現結果出問題這麼一說的。

很多初學者,習慣於將所有的方法都寫成靜態方法,理由是調用簡單,想來是對OO思想了解不透的緣故。一般情況下,我們可以遵循以下幾個簡單的原則。

1. 當方法不需要保存狀態,不需要調用外界變量(非方法參數)時,適合用靜態方法。
2. 當類型中的方法是一些"互不相干"的幫助型(Helper)方法時,適合使用 static class / static method。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章