2010-11-28 5 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にアクセスしようとしたためです。 ListWaitHandlesを追加する必要がある場合は、適切にList<T>::Add() methodという名前を使用します。

これは、一方:

new WaitHandle[4]; 

は、上記の行が終了する時点で存在であろう4 WaitHandlesのアレイを作成します。

+0

を試してみてください新しいWaitHandle [4]; 私は容量のプロパティしか見ることができないので、プロパティの数は読み取り専用です。このようにして、N個の要素のメモリを分離したくないので、N個の要素を持つコレクションを作成したいと思います。ありがとう。 – ludicode

+0

@ludicode:別の質問がある場合は、Stack Overflowに関する別の質問としてそれを聞くことをお勧めします。 –

+0

@ludicode:4つのWaitHandlesが必要であることが分かっている場合は、それ以上はなく、少なくても、配列に固執してください。アイテムを追加したり削除したりできるWaitHandlesのコレクションが必要な場合は、リストを使用します。 – Carson63000

2

あなたが代わりにこれを試してみたい:次のように一般的な形式を表現する方法はあります:: WaitHandle [] A =

​​
0

はそれでは、質問を変更しましょう。この

List<WaitHandle> arraywaithandles = 
    Enumerable.Repeat<WaitHandle>(null, 4).ToList(); 
関連する問題