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


321

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

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

在行:

public static const string CONST_NAME = "blah";

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

Answers:


583

一个const对象永远是static


2
const使变量不变,并且不能更改。
塞缪尔

6
@jinguy:const本质上就是静态的-如果您有任何const,它就已经是静态的,因此不需要也不能指定static。
约翰·鲁迪

8
@jjnguy:为什么?readonly实际上比Java的final变量更灵活-您可以在构造函数中随意设置它多次,但不能在其他地方设置。那可能非常方便。
乔恩·斯基特

67
常量在编译时内联,在运行时不存在于静态类型对象中。静态函数不是内联的,而是驻留在类型对象中。我添加这个只是因为没有人提到差异...

3
它们仍然在执行时出现-例如,您可以通过反射来获取它们(例如,使用GetField)。
乔恩·斯基特


32

编译器将const成员视为静态成员,并暗示常量值的语义,这意味着可以使用常量常量成员的值(而不是对该成员的引用)将对常量的引用编译为使用代码。

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

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

注意,这是准时制。当JIT'ter发挥作用时,它们可能会将它们都作为值编译到目标代码中。


非常重要的一点是,编译后的代码假定常量值在将来的版本中不会更改。
PJTraill

6

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
据我所知,Java的final行为完全类似于C#readonly,完全不一样const
Ben Voigt 2014年

@jjnguy感谢您的编辑;我真的不知道为什么选择原来的措辞。
Meowmaritus 2014年

6

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

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

因此,在const字段中使用static就像尝试在C / C ++中使已定义的(带有#define)静态一样……由于在编译时它会被其值替换,因此它会为所有实例(= static)初始化一次。


2

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

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.