c#中的`static`是什么意思?

问题描述 投票:49回答:4

我真的对C#中static关键字的真正含义感到困惑。我在互联网上浏览了不同的文章,但没有一篇文章能真正帮助我理解它的含义,而且其他来源也不值得信任。我知道Stack Overflow有一些聪明的头脑,他们可以帮助我理解static的真正含义,例如

  • 当它们被初始化后。
  • 静态方法、属性、类和构造函数
  • 静态VS只读VS常态
c# static
4个回答
88
投票

简而言之,static有效地意味着 "与一个类型相关联,而不是该类型的任何一个实例"。所以有 一个 一个类型(在AppDomain内)的静态变量集,无论你有0个实例还是100万个实例;你不需要一个实例来访问静态成员等。

在这里,你不需要实例来访问静态成员等。确切 静态变量的初始化点取决于是否还有一个静态构造函数,但非常宽泛地说,它是 "一次,通常在类中发生任何重大事件之前"。(参见 本博文 以获得更详细的描述)。)

readonly 字段可以是静态的,也可以是实例的(即与类型相关或与类型的实例相关)。const 值是 始终 隐式静态的 (它们是编译时的常量,所以每个实例有一个副本是没有意义的)。

有时你可能会看到 static 被描述为 "一个类型的所有实例之间共享"--我个人认为这是我的观点。嫌弃 这种描述,因为它意味着至少要有一个实例... 而实际上,你不需要... ... 任何 实例,以便使用静态成员。我更愿意把它们看作是完全独立的,而不是在实例之间 "共享"。


12
投票

我可以推荐这篇文章,它看起来很有描述性。Static Keyword Demystified

我还会推荐一篇官方的c#编程指南文章,它涵盖了静态关键字的各种用法。你可以从那里出发,因为有很多链接到不同的MSDN文章。静态类和静态类成员 (C#编程指南)


9
投票

关于constant(const)和readonly。

  • constant或const是不能被修改的变量,在编译时就知道其值。
  • readonly和constant非常相似,也不能被修改,不同的是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:
readonly PersonClass a=new PersonClass("name"); // all correct

7
投票

从文档中可以看出:

一个类的静态字段变量初始化器对应的是一系列的赋值,这些赋值按照它们在类声明中出现的文字顺序被执行。

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

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

Staticreadonlyconstant. Static 是一种方式像一个成员 习得, readonlyconstant 俨然是个会员 仓储式管理.

© www.soinside.com 2019 - 2024. All rights reserved.