该常量不能标记为静态


Answers:


197

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

不要创建常量来表示您希望随时更改的信息。例如,请勿使用常量字段存储服务的价格,产品版本号或公司的品牌名称。这些值会随着时间而变化,并且由于编译器会传播常量,因此必须重新编译使用库编译的其他代码才能查看更改。

DotNetPerls

DLL。当您使用const字段或声明时,C#编译器实际上将const变量的值直接嵌入到IL代码中。因此,它实质上将const作为单独的实体擦除。

注意:如果更改值const后未重新编译依赖于a的程序const,则它们可能会中断[,因为它们将继续使用先前的值 ]。



9

你不能有静态常量。尝试使用readonly而不是const或直接删除“ static”,因为“ const”仍然暗含静态。



3

所有常量声明都是隐式静态的,并且C#规范指出,禁止(冗余)包含static修饰符。我相信这是为了避免如果读者看到两个常量(其中一个声明为static而不是一个未声明)可能会引起的混乱-他们可以轻松地认为规范的差异暗示了语义上的差异。话虽如此,但不禁止冗余地指定访问修饰符,它也是默认的访问修饰符,可以选择。例如,(默认)方法可以将(具体)方法显式标记为私有方法。规则似乎是在没有选择的地方(例如,接口中的方法声明),冗余修饰符被禁止。可以选择的地方是允许的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.