2011-03-17 129 views
4

我有这样的事情:为什么我不能在c#中访问公共常量?

namespace MyNamespace {  

    public partial class MyClass: UserControl { 

     public static const String MYCONST = "MyConstant"; 

我看不到MYCONST从任何地方甚至从MyClass的,为什么呢?

+2

你有编译错误吗?它说什么 ? – driis 2011-03-17 21:12:25

+0

你是如何访问它的? – 2011-03-17 21:12:47

+3

尝试删除“静态”或“常量”关键字中的任意一个。 – Mikhail 2011-03-17 21:13:54

回答

11

无论如何,一个常量在静态上下文中可用,所以删除static关键字,你会没事的。

MSDN文档:

static修饰符不恒定的声明允许。

的原因是一个恒定的值必须在编译时完全计算,什么编译器是,它需要的是价值和整个常数值的代码替换所有不变的惯例。

这就是为什么它有时可以更好地使用公共只读值而不是编译器而不是用值替换用法,而是链接到只读变量。当从另一个程序集使用常量时,这是特别需要考虑的事项,因为您可能不会一次更新所有程序集,而最终可能会使用旧的常量值进行程序集。

编号:http://msdn.microsoft.com/en-us/library/e6w8fe1b(v=vs.80).aspx

3

应该可以访问如MyNamespace.MyClass.MYCONST

6

根据文档const

static声明中不允许使用static修饰符。

从常量中删除静态关键字,它应该工作。

编辑
注意,一个const将作为一个类的成员,当你有staticconst变量只是喜欢。但对于conststatic是隐含的,不允许输出。

+1

你不能是静态的和不变的。就像隐形和粉红色一样。 – madmik3 2011-03-17 21:17:54

+0

尝试只读,但这意味着它在静态构造函数中被暴露。 *耸肩* – 2011-03-17 21:19:09

5

你使用的是哪种类型的编译器?

通常,公开常量不是一个好主意。它们的行为不同于只读变量,它们的字面值被编译到IL中。如果在另一个程序集中声明const,这是一个问题。例如,您可以为修改常量值的程序集提供错误修复程序。然而,产品中的其他装配将继续使用旧值。抖动不会抱怨不匹配。不好。

公共常量只有在'manifest'常量时才是可以的。像Math.PI一样,只有在另一个Universe中运行代码才会产生意外的结果。产品或公司名称已相当危险。

+0

我绝对同意。如果它将是'public','protected'或'protected internal',则它应该是'readonly'。只有“私人”或“内部”值或仅限于单一方法的值应该是“const”。 – 2011-03-17 22:23:43

相关问题