2010-11-28 10 views
1

Je demande cela parce que j'ai une erreur "ArgumentOutOfRange" en utilisant le formulaire générique.Aux experts: Quelle est la différence dans ce code?

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

ou ...

WaitHandle[] A = new WaitHandle[4] 

Cela fonctionne:

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

Cela ne fonctionne pas:

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

Répondre

7

Ce:

new List<WaitHandle>(4); 

creates a List object that has an initial capacity of 4 WaitHandles. Qu'est-ce que cela signifie est que le List après la ligne ci-dessus tiendra WaitHandles, mais a au moins assez de mémoire pour recevoir 4 WaitHandles sans avoir à effectuer une allocation de mémoire supplémentaire plus tard.

De cette façon, si vous savez que vous devrez insérer 200 WaitHandles mais ne pas réellement eux en ce moment, vous pouvez avoir la mémoire assez allouer objet List pour 200 WaitHandles en une seule fois au lieu d'avoir à réattribuer que vous ajoutez WaitHandles. C'est pourquoi votre première boucle for a généré une exception ArgumentOutOfRange car vous avez essayé d'accéder à WaitHandles non existant dans arraywaithandles. Si vous devez ajouter WaitHandles au List, alors vous utiliserez le bien nommé List<T>::Add() method.

Ceci, d'autre part:

new WaitHandle[4]; 

crée un tableau de 4 WaitHandles qui sera en existence au moment où la ligne se termine au-dessus.

+0

Alors changeons la question: Y at-il un moyen d'exprimer sous forme générique comme suit: WaitHandle [] A = nouvelle WaitHandle [4]; Je demande cela, parce que je pouvais seulement voir la propriété de la capacité, le nombre de propriétés est en lecture seule. De cette façon, je ne veux pas séparer la mémoire pour N éléments, je veux créer une collection qui aura N éléments. Merci. – ludicode

+0

@ludicode: Si vous avez une autre question, il est préférable de la poser comme autre question sur Stack Overflow. –

+0

@ludicode: si vous savez que vous voulez 4 WaitHandles, pas plus, pas moins, alors restez simplement avec le tableau. Utilisez la liste si vous voulez une collection de WaitHandles dans laquelle vous pouvez ajouter et supprimer des éléments. – Carson63000

2

Vous voulez essayer ceci:

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

essayer cette

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