如何检查一个变量是否是常量?

5

我希望检查一个变量是否是常量。我该怎么做?我Google了很多,但没有找到答案。

我在一个类里有一行代码:public const string xxx,我想在另一个类中检查xxx是否是常量。


但是,良好的编程实践是将常量变量命名为大写字母... - Gowtham
5
你能提供更多关于这个请求的背景吗?为什么你想要检查这样的事情? - Kjartan
6
@Goron:在C#中这不是一个好的做法。 - Eric Lippert
1个回答

16
如何检查一个变量是const还是非const?
没有变量是const。 "变量"和"const"是相反的:变量是可以更改的存储位置。常量是不可更改的值。
你能说一下为什么要问这个问题吗?可能你正走上一些错误的道路;说出你真正的问题,你就有更好的机会得到解决方案。
更新:问题已经澄清。问题实际上是:
如何判断类或结构体的成员是变量还是常量?
您可以使用反射来判断,像这样:
- 通过任何您喜欢的技术获得类或结构体的Type。 - 如果您不知道名称,请使用GetFields获取类型的成员的FieldInfo,否则使用GetField。 - 常量的FieldInfo将设置IsLiteral为true,并将IsInitOnly设置为false。

请注意,规则有点棘手。记住有三种东西:普通变量、只读变量和常量。变量是可以改变的存储位置。常量是不可改变的值。但只读变量是只能在构造函数或初始化器中更改的变量,因此有时被归类为变量,有时被归类为值,但从不被归类为常量。

再次强调,如果您说出正在做这件事的原因,可能会有更好的解决方案。


啊,我的意思是我有一行代码像这样 public const string xxx,我想知道在另一个类中 xxx 是不是一个常数。 - TIANLUN ZHU
1
@giusti,你的前提是正确的,但结论却完全相反。变量确实是存储的抽象,没错。常量没有存储。它只是一个值,而不是一个位置。这就是为什么常量变量不是一回事的原因。 - Eric Lippert
1
这个问题涉及到C#而不是C。你不能把C的规则应用到C#上。 - Eric Lippert
2
在C#中,一个初始化后不能被更改的变量被称为“readonly”字段,在初始化器和构造函数中被归类为变量,在其他上下文中被归类为。但在任何情况下都不被归类为常量。 C#精确地定义了“变量”和“常量”这些词语。如果你在谈论C#,最好的做法是使用它们在C#中的定义;我们编写这些定义是为了帮助你清晰明了地表达。 - Eric Lippert
1
@giusti:另外,我注意到在C#中,您不能获取常量的地址,也不能构造常量数组,唯一合法的常量数组引用是null。 - Eric Lippert
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接