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

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

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

请解释 …

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

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

如果需要维护作为引用类型的“常量”实例集,通常使用一组public static readonly字段(例如System.Drawing.SystemColors的成员)来执行此操作。

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

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

 public const int MaxValue = 100; 

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

如果你写了这个:

 public static readonly int MaxValue = 100; 

那么他们assembly中的参考将仅仅是参考。 当有人运行程序集B时,将从程序集assemblyA中加载值100。

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

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

不过要小心。 如果const项是引用类型,则必须在编译时计算分配的表达式,这意味着可以给引用的唯一可能值为null (具有值得注意的有用的字符串exception)。

一个(非只读)静态可以在声明后更改,而常量则不能。 另外,不能使用函数设置常量,而静态变量可以设置。

常量是一个无法更改值的变量。

static是一个不能在其声明范围之外使用的变量。 也就是说,如果它是一个全局变量,那么它只能在声明它的文件中使用。 如果它是函数内部的变量,那么它只能在该函数内部使用。