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

时间:2010-03-25 03:42:47

标签: c#

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

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

请解释......

5 个答案:

答案 0 :(得分:36)

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

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

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

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

答案 1 :(得分:14)

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

public const int MaxValue = 100;

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

如果你写了这个:

public static readonly int MaxValue = 100;

然后他们的程序集中的引用仍然只是一个引用。当有人运行程序集B时,值100将从您的程序集,程序集A加载。

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

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