C#中常量和Static的区别是什么?

C#中常量和Static的区别是什么?,c#,C#,我很想知道常量变量和静态变量之间的区别 据我所知,常量也是静态的,不能在与静态相同的实例变量上访问,那么它们之间有什么区别呢 请解释…静态(非只读)可以在声明后更改,而常量不能更改。此外,不能使用函数设置常量,而可以使用静态变量。正如您所说,static和const都附加到类型,而不是类型的实例。但是,您仍然可以更改静态项。不能更改常量项 不过要小心。如果常量项是引用类型,则必须在编译时对指定的表达式求值,这意味着您可以提供引用的唯一可能值是null(字符串除外)。const字段只能保存值类型或

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

据我所知,常量也是静态的,不能在与静态相同的实例变量上访问,那么它们之间有什么区别呢


请解释…

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

正如您所说,static和const都附加到类型,而不是类型的实例。但是,您仍然可以更改静态项。不能更改常量项


不过要小心。如果常量项是引用类型,则必须在编译时对指定的表达式求值,这意味着您可以提供引用的唯一可能值是
null
(字符串除外)。

const
字段只能保存值类型或
System.String
。它们在编译时必须是不可变的和可解析的

静态只读
字段可以而且通常确实保存引用类型,而引用类型(字符串除外)只能在运行时创建。这些可以(但不应该)是可变类型;唯一不能更改的是引用本身

如果需要维护一组引用类型的“常量”实例,通常可以使用一组
公共静态只读
字段(例如


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

一个微妙但关键的区别是
const
在编译时求值,而
static
在运行时求值。这对版本控制有重要影响。例如,假设您编写:

public const int MaxValue = 100;
您编译并发布您的程序集(程序集A)。然后其他人编写一个引用MaxValue的程序集(程序集B)。在本例中,值100被编译到它们的程序集以及您的程序集中

如果你写了这个:

public static readonly int MaxValue = 100;
那么,它们的集合中的引用将仍然只是一个引用。当有人运行程序集B时,将从程序集A加载值100


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

常量是一个值不能更改的变量


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

这听起来不太正确。Static在字段上也是有效的。唯一可能的常量引用类型是字符串。你不能改变一个字符串。同样值得注意的是,const只能保存两种引用类型:string和nullIt。在我写了它之后,它听起来也不对。所以我去检查了-,你可以有一个常量的引用类型。我知道这是可能的。但除字符串外,执行此操作时必须为null。更新我的答案以反映这一点。参考资料如下:
常量表达式是一个可以在编译时完全计算的表达式。因此,引用类型的常量的唯一可能值是string和null。
常量变量是不存在的。此外,可以在构造函数中更改静态只读,因此不同的构造函数可以为静态只读字段提供不同的值。