为什么我不能拥有“public static const string S =”stuff“;在我的班级?

时间:2009-01-02 22:35:43

标签: c# const constants

当我尝试编译我的课时,我收到一个错误:

  

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

在这一行:

public static const string CONST_NAME = "blah";

我可以用Java一直这样做。我究竟做错了什么?为什么不让我这样做?

6 个答案:

答案 0 :(得分:519)

const对象始终为static

答案 1 :(得分:87)

来自C# language specification (PDF格式第287页 - 或PDF的第300页):

  

即使考虑了常数   静态成员,常数   声明既不要求也不要   允许使用静态修饰符。

答案 2 :(得分:32)

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

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

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

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

答案 3 :(得分:5)

C#的const与Java的final完全相同,除了它绝对是static。在我看来,const变量不一定是非static,但如果您需要访问const变量非 - 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个小时的工作,包括尝试各种不同的回答方式和代码格式化,这个答案,我仍然发布它。 :)

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

答案 4 :(得分:5)

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

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

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

答案 5 :(得分:2)

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