在c#中的静态关键字

我真的很困惑与静态关键字在C#中的真正含义。 我已经通过互联网上的不同文章,但没有一个真的帮助我了解它的意义和其他来源是不可信的。 我知道堆栈溢出有一些聪明的头脑可以帮助我理解静态的真正意义

  • 当他们被初始化。
  • 静态方法,属性,类和构造函数
  • 静态与只读与常量

总之,静态有效的意思是“与一个types相关联,而不是任何一个types的实例”。 所以对于一个types(在一个AppDomain中),有组静态variables,不pipe你是否有一个或一百万个; 您不需要实例来访问静态成员等

静态variables初始化的确切点取决于是否还有一个静态构造函数,但从广义上来说,它是“一次,通常在课程中发生任何重大事件之前”。 (有关更详细的描述,请参阅此博客文章 。)

虽然readonly字段可以是静态的或实例的(即与types相关或与types的实例相关),但const始终是隐式静态的(它们是编译时常量,所以没有意义每个实例复制)。

有时你可能会看到static被描述为“在一个types的所有实例之间共享” – 我个人不喜欢这个描述,因为它表明至less有一个实例…而实际上,你不需要任何实例为了使用静态成员。 我更喜欢把它们看作是完全独立的,而不是在实例之间“共享”。

我可以推荐这篇文章,它似乎很漂亮描述: 静态关键字揭秘

我还会推荐一个官方的c#编程指南文章,其中介绍了static关键字的各种用法。 您可以从那里去,因为有很多链接到不同的MSDN文章: 静态类和静态类成员(C#编程指南)

关于常量(const)和只读:

  • 常量或常量是无法修改的variables,以及在编译时已知的值。
  • 只读是非常类似于常量,这也不能修改,区别在于一个只读字段可以在构造函数中修改/初始化一次。 之后readonly是一样的常量。

使用示例:

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

但是当我们想要在编译时不知道值的恒定字段时该怎么办?

 eg const PersonClass a=new PersonClass("name"); // error 

答案是只读字段:

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

从文档:

类的静态字段variables初始值设定项对应于一系列的赋值语句,它们按照它们出现在类声明中的文本顺序执行

静态成员在首次访问该类时初始化,并按文本顺序执行。

Static方法,属性是类的一部分,而不是实例。

StaticreadonlyconstantStatic是一个像成员一样的方式, readonlyconstant就像一个成员存储/pipe理的方式