有很多C ++背景我已经习惯了写下面的内容:
const int count = ...; //some non-trivial stuff here
for( int i = 0; i < count; i++ ) {
...
}
我希望在C#中也能正常工作。然而...
byte[] buffer = new byte[4];
const int count = buffer.Length;
产生错误CS0133:分配给'count'的表达式必须是常量。
我不明白。为什么这个无效? int
是值类型,不是吗?为什么我不能这样分配值并使变量不可更改?
答案 0 :(得分:23)
因为C#中的const
比C ++中的const
要多const
。 ;)
在C#中,const
用于表示编译时常量表达式。它类似于这个C ++代码:
enum {
count = buffer.Length;
}
因为buffer.Length
是在运行时计算的,所以它不是常量表达式,因此会产生编译错误。
C#有readonly
个关键字,与C ++的const
更相似。 (虽然它仍然有限,但在C#中没有const-correctness这样的东西)
答案 1 :(得分:11)
const
用于表示编译时常量...而不仅仅是一个只读值。
我不敢在C#中指定只读但非编译时常量的局部变量。一些局部变量本质上是只读的 - 例如foreach
循环中的迭代变量以及using
语句的fisrt部分中声明的任何变量。但是,您无法创建自己的只读变量。
如果在方法中使用const
,则有效地将该标识符的任何用法替换为编译时常量值。就个人而言,我很少看到这在真正的C#代码中使用过。
答案 2 :(得分:5)
答案 3 :(得分:2)
另请注意,在C#中,修饰符readonly
仅适用于成员变量,不适用于局部变量(即在方法中定义)。
Microsoft可能应该在C#参考指南中更具体:
http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx