397

尝试编译我的类时出现错误:

常量'NamespaceName.ClassName.CONST_NAME'不能标记为静态。

在线:

public static const string CONST_NAME = "blah";

我可以一直在 Java 中做到这一点。我究竟做错了什么?为什么它不让我这样做?

4

6 回答 6

706

一个const对象总是static

于 2009-01-02T22:37:34.243 回答
115

C# 语言规范 (PDF 第 287 页或 PDF 第 300 页):

即使常量被认为是静态成员,常量声明既不需要也不允许静态修饰符。

于 2009-01-02T22:40:21.633 回答
38

编译器认为 const 成员是静态的,并且意味着常量值语义,这意味着对常量的引用可能会编译到使用代码中作为常量成员的值,而不是对成员的引用。

换句话说,包含值 10 的 const 成员可能会被编译为将其用作数字 10 的代码,而不是对 const 成员的引用。

这与静态只读字段不同,静态只读字段将始终编译为对该字段的引用。

请注意,这是预 JIT。当 JIT'ter 发挥作用时,它可能会将这两者作为值编译到目标代码中。

于 2009-01-02T22:41:47.930 回答
8

C#const与 Java 完全相同final,只是它绝对总是static. 在我看来,一个变量并不是真的必须const是 non- static,但是如果你需要访问一个const变量 non- static,你可以这样做:

class MyClass
{    
    private const int myLowercase_Private_Const_Int = 0;
    public const int MyUppercase_Public_Const_Int = 0;

    /*        
      You can have the `private const int` lowercase 
      and the `public int` Uppercase:
    */
    public int MyLowercase_Private_Const_Int
    {
        get
        {
            return MyClass.myLowercase_Private_Const_Int;
        }
    }  

    /*
      Or you can have the `public const int` uppercase 
      and the `public int` slighly altered
      (i.e. an underscore preceding the name):
    */
    public int _MyUppercase_Public_Const_Int
    {
        get
        {
            return MyClass.MyUppercase_Public_Const_Int;
        }
    } 

    /*
      Or you can have the `public const int` uppercase 
      and get the `public int` with a 'Get' method:
    */
    public int Get_MyUppercase_Public_Const_Int()
    {
        return MyClass.MyUppercase_Public_Const_Int;
    }    
}

好吧,现在我意识到这个问题是 4 年前提出的,但是由于我在这个答案中投入了大约 2 个小时的工作,包括尝试各种不同的回答方式和代码格式,所以我仍然在发布它。:)

但是,为了记录,我还是觉得有点傻。

于 2013-03-20T00:39:30.137 回答
7

来自 MSDN:http: //msdn.microsoft.com/en-us/library/acdd6hb7.aspx

...此外,虽然const 字段是编译时常量,但 readonly 字段可用于运行时常量...

因此,在 const 字段中使用静态就像试图在 C/C++ 中创建一个已定义的(使用#define)静态......因为它在编译时被其值替换,当然它为所有实例启动一次(=静态) .

于 2013-09-30T11:21:38.537 回答
2

const 类似于 static 我们可以使用类名访问两个变量,但 diff 是静态变量可以修改而 const 不能。

于 2013-06-07T07:10:35.793 回答