2010-08-10 62 views
2

我想遵循一次計算數組長度,然後使用一個值的一些優秀的C++的建議,而不必調用一個函數,如下所示:爲什麼Array.Length和Array.Count()不能分配給常量值?

代替:

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。這是爲什麼?

+1

這是一堆問題的重複。簡單的答案是在C#中的const意味着編譯時間常量,而不是在C++中意味着分配一次 – 2010-08-10 17:31:30

回答

7

const關鍵字要求值爲在編譯時知道 - 在.NET編譯無法確定arr.length值,當你編譯代碼,這樣你就可以」 t將其分配給const

關於你最後一個關於getter和setter的問題 - 如果你使用簡捷語法:即private long n { get; private set; },你必須聲明只有。如果對本地字段使用完整的詳細屬性聲明,則可以聲明一個get:

private long _n = 0; 
private long N { get { return _n; } } 
4

C#中const的定義需要一個可在編譯時進行評估的初始值設定項。

Look here.

您可以使用readonly

相關問題