2012-02-23 63 views
37

我對C#中static關鍵字的真正含義感到困惑。我在互聯網上瀏覽過不同的文章,但沒有一篇真正幫助我理解它的含義,其他來源也不可信。我知道堆棧溢出有一些聰明的頭腦誰可以幫助我瞭解靜態的真正意義,如c中的靜態關鍵字#

  • 當他們被初始化。
  • 靜態方法,屬性,類和構造
  • 靜態VS只讀VS恆定
+6

http://www.codeproject.com/Articles/15269/Static-Keyword-Demystified – ken2k 2012-02-23 09:57:55

+3

這是一個家庭作業的問題? – 2012-02-23 09:58:40

+5

您是否閱讀過['static'](http://msdn.microsoft.com/zh-cn/library/98f28cdx.aspx)上的MSDN文檔?你有什麼不明白的地方? – Oded 2012-02-23 09:59:02

回答

68

總之,靜態實際上意味着「與一種類型代替所述類型的任何一個實例關聯」。所以有一個一個類型(在一個AppDomain內)的靜態變量的集合,無論你有0個還是一個萬;你並不需要一個實例訪問靜態成員,等等

確切點靜態變量的初始化取決於是否也有一個靜態構造函數或沒有,但很廣義上說,它的「一次,通常前班上發生的任何重大事件「。 (爲一個更詳細的描述見this blog post。)

雖然readonly字段可以是靜態的或實例(即相關的類型或相關的類型的實例),const總是隱式靜態的(它們」重新編譯時常量,所以每個實例只有一個副本是沒有意義的)。

有時您可能會看到static被描述爲「一個類型的所有實例之間共享」 - 我個人不喜歡描述,因爲它表明,必須有至少一個實例......而實際上,你不爲了使用靜態成員,不需要任何實例。我更喜歡將它們視爲完全獨立,而不是在實例之間「共享」。

+6

如何整潔和詳細:)我的upvote! – 2012-02-23 10:30:22

+0

謝謝:)這有助於我理解「靜態」 – Karthik 2013-01-30 11:55:43

+0

您的博客文章鏈接已損壞,根據這篇文章http://stackoverflow.com/a/665696/1668069 appdomain共享堆,是真的,靜態類總是有他們在AppDomains上共享的堆中的1個實例,是真的嗎? – Mathematics 2015-10-16 13:32:24

6

從技術文檔:一類

的靜態字段變量初始化對應分配的 序列被執行在 的文本順序中,它們出現在類聲明中

靜態成員初次訪問該類時初始化並按文本順序執行。

Static方法,屬性是的一部分,而不是實例。與readonlyconstant無關。Static是一種像會員acess,readonlyconstant就像一個成員存儲/管理

8

一些關於常數(常數)和只讀:

  • 恆定或const是變量,它不能被修改,並且該值是在編譯時已知的。
  • readonly與常量非常相似,這也不能修改,區別在於只能在構造函數中修改/初始化一個只讀字段。在那之後,readonly和constant一樣。

使用的例子:

constant: 
const int a=10; // value cannot be modified, value is known at compile time 

但是做什麼,當我們想定場衛生組織值在編譯時不知道?

e.g const PersonClass a=new PersonClass("name"); // error 

的答案是隻讀字段:

readonly: 
readonly PersonClass a=new PersonClass("name"); // all correct