C#中Const和Static有什么区别?

Emb*_*rja 26 c#

我很想知道const变量和静态变量之间的区别.

据我所知,const也是静态的,无法在与静态相同的实例变量上访问,那么它们之间有什么区别?

请解释 ...

Aar*_*ght 39

const字段只能包含值类型或System.String.它们必须在编译时是不可变的并且可以解析.

static readonly字段一般可以保存引用类型,只能在运行时创建(字符串除外).这些可以(但不应该)是可变类型; 唯一不能改变的是引用本身.

如果需要维护作为引用类型的"常量"实例集,通常需要使用一组public static readonly字段,例如System.Drawing.SystemColors的成员.

最后但并非最不重要的是,readonly字段的初始化可以推迟到构造函数的执行,这意味着它即使只能写入一次,也不一定要用完全相同的值进行初始化.声明的真常量const只能有一个值(在编译时指定).

  • 此外,静态只读可以在构造函数中更改,因此不同的构造函数可以为静态只读字段提供不同的值。 (2认同)

ito*_*son 14

一个微妙但关键的区别是consts在编译时statics进行评估,而在运行时进行评估.这对版本控制有重要影响.例如,假设你写:

public const int MaxValue = 100;
Run Code Online (Sandbox Code Playgroud)

编译并运送程序集(程序集A).然后其他人写了一个引用MaxValue的程序集(程序集B).在这种情况下,值100将被编译到它们的程序集中以及您的程序集中.

如果你写了这个:

public static readonly int MaxValue = 100;
Run Code Online (Sandbox Code Playgroud)

那么他们装配中的参考将仅仅是参考.当有人跑大会B,价值100将从加载你的装配,装配A.

例如,这可能会影响简单的修补方案.如果您发布更新的程序集A,其中MaxValues声明为200,并且用户将该版本复制到先前版本(但不重新编译程序集B),则在第一个场景中,程序集B将继续运行,就好像MaxValues为100,因为这const是编译到程序集B中的值.在第二个场景中,程序集B将获取新值,因为它static在运行时加载非const 变量.


Joe*_*orn 6

如你所说,static和const都附加到一个类型而不是一个类型实例.但是,您仍然可以更改静态项目.您无法更改const项目.

不过要小心.如果您的const项是引用类型,则必须在编译时评估已分配的表达式,这意味着您可以给出引用的唯一可能值null(具有值得注意的有用的字符串异常).