2010-11-28 32 views
1

我問這個,因爲我得到了一個使用通用形式的錯誤「ArgumentOutOfRange」。致專家:本準則有何區別?

List<WaitHandle> arraywaithandles = new List<WaitHandle>(4); 

或...

WaitHandle[] A = new WaitHandle[4] 

這工作:

 for (int i = 0; i < 4; i++) 
     { 
      A[i] = (arrayresultados[i].AsyncWaitHandle); 
     } 

這不起作用:

 for (int i = 0; i < 4; i++) 
     { 
      arraywaithandles[i] = (arrayresultados[i].AsyncWaitHandle); 
     } 

回答

7

此:

new List<WaitHandle>(4); 

creates a List object that has an initial capacity of 4 WaitHandles。這意味着List之後的上述行將保持爲零WaitHandles,但至少有足夠的內存來接收4 WaitHandles,而不必稍後執行額外的內存分配。

這樣一來,如果你知道你需要插入200 WaitHandles,但實際上並沒有他們,現在,你可以有List目的是在一個分配足夠的內存爲200 WaitHandles去,而不必重新分配爲您添加WaitHandles

這就是爲什麼您的第一個for循環會拋出ArgumentOutOfRange異常,因爲您試圖訪問arraywaithandles中不存在的WaitHandles。如果您需要將WaitHandles添加到List,那麼您將使用恰當地命名爲List<T>::Add() method

此,在另一方面:

new WaitHandle[4]; 

創建的4 WaitHandles數組,將在存在由上述線結束的時間。

+0

因此,讓我們改變了一個問題:是否有表達的通用形式如下的方式: 的WaitHandle [] A =新的WaitHandle [4]; 我問這個,因爲我只能看到容量屬性,屬性數是隻讀的。這樣,我不想爲N個元素分開內存,我想創建一個有N個元素的集合。謝謝。 – ludicode 2010-11-28 06:59:17

2

你想,而不是嘗試:

​​
0

試試這個

List<WaitHandle> arraywaithandles = 
    Enumerable.Repeat<WaitHandle>(null, 4).ToList();