Answers:
const暗示static(您不需要实例来引用该const值)。
我还想补充一点:当您使用链接到(引用)程序集时public const,该值将被复制到您的程序集中。因此,如果const引用的程序集中的值发生更改,则您的程序集仍将具有原始编译的值。
如果这种行为是不接受的,那么你应该考虑做该领域的public static readonly领域。
Lib.dll,以二进制形式提供:
public class Foo {
public const int HATS = 42;
public static readonly int GLOVES = 33;
}
App.exe,引用Lib.dll:
Foo.HATS // This will always be 42 even if the value in Lib.dll changes,
// unless App.exe is recompiled.
Foo.GLOVES // This will always be the same as Foo.GLOVES in Lib.dll
从MSDN:
不要创建常量来表示您希望随时更改的信息。例如,请勿使用常量字段存储服务的价格,产品版本号或公司的品牌名称。这些值会随着时间而变化,并且由于编译器会传播常量,因此必须重新编译使用库编译的其他代码才能查看更改。
DLL。当您使用
const字段或声明时,C#编译器实际上将const变量的值直接嵌入到IL代码中。因此,它实质上将const作为单独的实体擦除。注意:如果更改值
const后未重新编译依赖于a的程序const,则它们可能会中断[,因为它们将继续使用先前的值 ]。
所有常量声明都是隐式静态的,并且C#规范指出,禁止(冗余)包含static修饰符。我相信这是为了避免如果读者看到两个常量(其中一个声明为static而不是一个未声明)可能会引起的混乱-他们可以轻松地认为规范的差异暗示了语义上的差异。话虽如此,但不禁止冗余地指定访问修饰符,它也是默认的访问修饰符,可以选择。例如,(默认)方法可以将(具体)方法显式标记为私有方法。规则似乎是在没有选择的地方(例如,接口中的方法声明),冗余修饰符被禁止。可以选择的地方是允许的。