Для экспертов: в чем разница в этом коде? - PullRequest
1 голос
/ 28 ноября 2010

Я спрашиваю об этом, потому что я получил ошибку "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);
        }

Ответы [ 3 ]

7 голосов
/ 28 ноября 2010

Это:

new List<WaitHandle>(4);

создает List объект, который имеет начальную емкость 4 WaitHandles. Это означает, что List после вышеприведенной строки будет содержать ноль WaitHandles, но имеет по крайней мере достаточно памяти для получения 4 WaitHandles без необходимости дополнительного выделения памяти позже.

Таким образом, если вы знаете, что вам нужно будет вставить 200 WaitHandles, но на самом деле у вас их нет прямо сейчас, вы можете заставить объект List выделять достаточно памяти для 200 WaitHandles за один раз вместо перераспределить при добавлении WaitHandles.

Вот почему ваш первый цикл for вызвал исключение ArgumentOutOfRange, потому что вы пытались получить доступ к несуществующему WaitHandles в arraywaithandles. Если вам нужно добавить WaitHandles к List, то вы должны использовать метко названный List<T>::Add() метод .

Это, с другой стороны:

new WaitHandle[4];

создает массив 4 WaitHandles, который будет существовать к моменту окончания указанной строки.

2 голосов
/ 28 ноября 2010

Вы хотите попробовать это вместо:

for (int i = 0; i < 4; i++)
{
    arraywaithandles.Add(arrayresultados[i].AsyncWaitHandle);
}
0 голосов
/ 28 ноября 2010

попробуйте

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