我对C#中static关键字的真正含义感到困惑。我在互联网上经历了不同的文章,但没有一篇能真正帮助我理解它的含义而其他来源不可信。我知道Stack Overflow有一些聪明的头脑可以帮助我理解静态的真正含义
答案 0 :(得分:83)
简而言之,static实际上意味着“与类型相关联而不是类型的任何一个实例”。因此,对于类型(在AppDomain中),一个静态变量集是否有0个实例或100万个;您不需要实例来访问静态成员等
静态变量初始化的精确点取决于是否还有一个静态构造函数,但从广义上讲它是“一次,通常在类中发生重大事件之前”。 (有关更详细的说明,请参阅this blog post。)
虽然readonly
字段可以是静态字段或实例字段(即与类型相关或与该类型实例相关),但const
值总是隐式静态(它们是编译时常量,因此每个实例都有一个副本是没有意义的。
您有时可能会将static
描述为“在所有类型的实例之间共享” - 我个人不喜欢该描述,因为它表明必须至少有一个实例...实际上,您不需要任何实例来使用静态成员。我更愿意将它们视为完全独立的,而不是在实例之间“共享”。
答案 1 :(得分:12)
我可以推荐这篇文章,看起来很有描述性: Static Keyword Demystified
我还推荐一篇官方的c#编程指南文章,其中涵盖了static关键字的各种用法。您可以从那里开始,因为有很多链接指向不同的MSDN文章:Static Classes and Static Class Members (C# Programming Guide)
答案 2 :(得分:8)
关于常量(常量)和只读的一点点:
使用示例:
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
答案 3 :(得分:7)
来自文档:
类的静态字段变量初始值设定项对应于a 以文本顺序执行的分配顺序 它们出现在类声明中
静态成员在首次访问类时初始化,并以文本顺序执行。
Static
方法,属性是类的一部分,而不是实例。
Static
与readonly
或constant
无关。 Static
就像会员 acessed ,readonly
和constant
就像会员存储/管理。