无法将常数
'NamespaceName.ClassName.CONST_NAME'
标记为静态。 > public static const string CONST_NAME = "blah";
我可以一直用Java做到这一点。我究竟做错了什么?为什么不让我这样做呢?
#1 楼
一个const
对象始终是static
。#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
并不是真正必要的,但是如果您需要访问非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个小时的工作,包括尝试各种不同的答案和代码格式化方式,因此我仍然在发布它。 :)
但是,从记录来看,我还是有点傻。
评论
据我所知,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)都启动一次。
评论
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