2012-02-23 42 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