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


无法将常数'NamespaceName.ClassName.CONST_NAME'标记为静态。 >
public static const string CONST_NAME = "blah";


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

#1 楼

一个const对象始终是static

评论


const使变量不变,并且不能更改。

–塞缪尔
09年1月2日在22:39

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

–约翰·鲁迪(John Rudy)
09年1月2日在22:40

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

–乔恩·斯基特(Jon Skeet)
09年1月2日于23:01

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

–user1228
09年1月2日于23:07

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

–乔恩·斯基特(Jon Skeet)
09年1月2日于23:16

#2 楼

从C#语言规范(PDF第287页-或PDF的第300页)中:


尽管常量被认为是静态成员,但常量
声明都没有需要nor
允许使用静态修饰符。


评论


也可以在这里找到:msdn.microsoft.com/en-us/library/aa645749(VS.71).aspx

–拉瑟·V·卡尔森(Lasse V. Karlsen)
09年1月2日在22:47

#3 楼

编译器认为const成员是静态的,并暗示常量值的语义,这意味着对常量的引用可能被编译为使用代码的常量成员的值,而不是对该成员的引用。 >
换句话说,包含值10的const成员可能会被编译成将其用作数字10的代码,而不是引用const成员。

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

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

评论


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

– PJTraill
15年12月14日在1:03

#4 楼

C#的const与Java的final完全相同,只是绝对总是static。我认为,const变量不是非static并不是真正必要的,但是如果您需要访问非conststatic变量,则可以执行以下操作:

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个小时的工作,包括尝试各种不同的答案和代码格式化方式,因此我仍然在发布它。 :)

但是,从记录来看,我还是有点傻。

评论


据我所知,Java final的行为完全类似于C#只读,根本不像const。

– Ben Voigt
2014-10-30 23:44

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

–喵喵
2014年12月24日19:26在

#5 楼

从MSDN:http://msdn.microsoft.com/zh-cn/library/acdd6hb7.aspx

...此外,虽然const字段是编译时常量,但readonly字段可以可以用于运行时常量...当然,编译时对所有实例(= static)都启动一次。

#6 楼

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