程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 編寫高質量代碼改善C#程序的157個建議——建議100:靜態方法和實例方法沒有區別,

編寫高質量代碼改善C#程序的157個建議——建議100:靜態方法和實例方法沒有區別,

編輯:C#入門知識

編寫高質量代碼改善C#程序的157個建議——建議100:靜態方法和實例方法沒有區別,


建議100:靜態方法和實例方法沒有區別

靜態方法在加載時機和內存使用上和實例方法完全一致。在這裡,我們先引出一個概念“類型對象”。比如類型Person,我們都知道new Person() 會產生一個對象,這個對象叫做“實例對象”,它在運行時會加載到GC Heap上。而“類型對象”是指代表Person類型本身的那個對象,這個對象在第一次使用類型時被加載到Loader Heap上。類型對象包括其自身的指針、自身的同步索引快、靜態字段,以及一個方法表。在這個方法表中,無論是靜態方法還是實例方法都會被存儲起來,當然,存儲的是方法的記錄項,方法本身是在調用時由運行時編譯的。類型對象和實例對象在內存中的分布如下:

如果一定要說靜態方法和實例方法的區別,那它們之間唯一的區別就是,當我們需要使用實例方法的時候,首先應該有實例對象。我們不能繞開實例對象,直接從類型本身去調用實例方法。所以,從設計的角度來說,如果一個方法只跟類型本身有關系,那麼它就應該被設計成靜態方法,如果跟類型的實例對象有關系,那它就應該被設計成實例方法。

靜態方法被不少人誤解的地方有:靜態方法天然就是同步方法。即使是那些有一定開發經驗的程序員,有時候也會犯這種常識性的錯誤。盡管微軟聲稱FCL中大部分代碼都被實現成線程安全了,但並不意味著代碼天然就是同步的,要讓靜態方法線程安全,必須由程序員編寫同步代碼,而不是讓編譯器或運行時為我們做這些事情。

要從設計的角度去理解靜態方法和實例方法。離開了設計,它們沒有區別。

 

 

轉自:《編寫高質量代碼改善C#程序的157個建議》陸敏技

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved