为什么Array.Length和Array.Count()不能分配给const值?

时间:2010-08-10 17:23:59

标签: c# arrays const

我想遵循一些优秀的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。为什么会这样?

2 个答案:

答案 0 :(得分:7)

const关键字要求在编译时知道该值 - .Net编译器在编译代码时无法确定arr.length的值,因此您无法将其分配给{ {1}}。

关于你关于getter和setter的最后一个问题 - 如果你使用捷径语法,你必须声明 const。如果对本地字段使用完整的详细属性声明,则可以声明get:

private long n { get; private set; }

答案 1 :(得分:4)

在C#中使用const定义需要一个可以在编译时进行评估的初始化程序。

Look here.

您可以使用readonly