我想遵循一些优秀的C ++建议来计算一次数组长度,然后使用一个值,而不必像这样调用一个函数:
而不是:
for( int i = 0; i < arr.length; ++i )
我写
const int size = arr.length; // or arr.Count()
for( int i = 0; i < size; ++i )
在阅读了另一个线程(Is it costly to do array.length or list.count in a loop)后,我注意到性能提升没有实际意义,而且这是C#而不是C ++。
第二个原因是用一个值初始化我的数组:
const int size = arr.Length;
int[] primes_ = new int[size];
所以我的问题是:
为什么我不能声明这个呢?它向我吐出错误:
Error 2 The expression being assigned to 'length' must be constant
这是非常令人困惑的,因为我的价值是不变的。但是,当我删除const
时,poof会传递消息。 ...什么?
长度读取的初始化:
来自MSDN的 public int Length {get;}
。这尤其令人困惑,因为我的上一个问题(Get-Set Accessor functionality differs on existence of get-set keyword)明确地给了我一个答案:“不可能宣布只有获得和离开集合缺席。”
我不清楚为什么我可以声明int size = arr.Length
,而不是const int size = arr.Length
。为什么会这样?
答案 0 :(得分:7)
const
关键字要求在编译时知道该值 - .Net编译器在编译代码时无法确定arr.length
的值,因此您无法将其分配给{ {1}}。
关于你关于getter和setter的最后一个问题 - 如果你使用捷径语法,你必须声明 :const
。如果对本地字段使用完整的详细属性声明,则可以声明get:
private long n { get; private set; }
答案 1 :(得分:4)