我真的对C#中static关键字的真正含义感到困惑。我在互联网上浏览了不同的文章,但没有一篇文章能真正帮助我理解它的含义,而且其他来源也不值得信任。我知道Stack Overflow有一些聪明的头脑,他们可以帮助我理解static的真正含义,例如
简而言之,static有效地意味着 "与一个类型相关联,而不是该类型的任何一个实例"。所以有 一个 一个类型(在AppDomain内)的静态变量集,无论你有0个实例还是100万个实例;你不需要一个实例来访问静态成员等。
在这里,你不需要实例来访问静态成员等。确切 静态变量的初始化点取决于是否还有一个静态构造函数,但非常宽泛地说,它是 "一次,通常在类中发生任何重大事件之前"。(参见 本博文 以获得更详细的描述)。)
而 readonly
字段可以是静态的,也可以是实例的(即与类型相关或与类型的实例相关)。const
值是 始终 隐式静态的 (它们是编译时的常量,所以每个实例有一个副本是没有意义的)。
有时你可能会看到 static
被描述为 "一个类型的所有实例之间共享"--我个人认为这是我的观点。嫌弃 这种描述,因为它意味着至少要有一个实例... 而实际上,你不需要... ... 任何 实例,以便使用静态成员。我更愿意把它们看作是完全独立的,而不是在实例之间 "共享"。
我可以推荐这篇文章,它看起来很有描述性。Static Keyword Demystified
我还会推荐一篇官方的c#编程指南文章,它涵盖了静态关键字的各种用法。你可以从那里出发,因为有很多链接到不同的MSDN文章。静态类和静态类成员 (C#编程指南)
关于constant(const)和readonly。
使用实例。
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:
readonly PersonClass a=new PersonClass("name"); // all correct
从文档中可以看出:
一个类的静态字段变量初始化器对应的是一系列的赋值,这些赋值按照它们在类声明中出现的文字顺序被执行。
静态成员在第一次访问类时被初始化,并按文本顺序执行。
Static
方法、属性是类的一部分。阶层 而不是实例。
Static
与 readonly
或 constant
. Static
是一种方式像一个成员 习得, readonly
和 constant
俨然是个会员 仓储式管理.