У меня проблемы с назначением начального размера для списка <T>классов - PullRequest
2 голосов
/ 21 февраля 2010

Я пытаюсь инициализировать список объектов (типа Rep). Вот код, который я использую для инициализации списка:

        public static List<Rep> Reps = new List<Rep>(new Rep[6]);  

Прямо сейчас, когда я пытаюсь присвоить значение строке в одном из классов списка следующим образом:

 Repository.Reps[repnum].Main = new TextRange(richTextBox1.Document.ContentStart,
 richTextBox1.Document.ContentEnd).Text;

Я исключение нулевой ссылки. Что я делаю неправильно? Я не смог найти документацию Msdn об установке начального размера списка.

Ответы [ 4 ]

5 голосов
/ 21 февраля 2010

Вот альтернативный способ заполнить список вновь созданными экземплярами объекта Rep, используя LINQ:

var reps = (from n in Enumerable.Range(0, 6)
            select new Rep()).ToList()

Это генерирует последовательность чисел от 0 до 5 (с использованием Enumerable.Range), а затем создает новый экземпляр Rep для каждого числа (обратите внимание, что нам действительно не нужно число n где-либо - он используется только для создания некоторой начальной последовательности длины 6. Затем мы можем использовать ToList для преобразования последовательности IEnumerable в тип List<Rep>.

В качестве альтернативы явное использование лямбда-функций (обратите внимание, что _ является допустимым именем переменной в C #, но это дает нам хороший синтаксис, который предполагает, что мы фактически игнорируем аргумент):

var reps = Enumerable.Range(0, 6).Select(_ => new Rep()).ToList()
5 голосов
/ 21 февраля 2010

Я думаю, что вы можете получить исключение нулевой ссылки, потому что Repository.Reps [repnum] равен нулю, когда вы пытаетесь установить значение свойства Main. Что вы делаете, это создаете Массив Репов размером 6, но все ссылки в этом массиве, который вы даете в Список, являются нулевыми. Попробуйте создать объект Rep и установить его свойство Main следующим образом:

Rep newRep = new Rep();
newRep.Main = new TextRange(richTextBox1.Document.ContentStart, richTextBox1.Document.ContentEnd).Text;

Repository.Reps[repnum] = newRep;

Если ваше намерение состоит в том, чтобы сначала все значения в списке были нулевыми, возможно, было бы проще использовать конструктор List (int) и создать список следующим образом:

public static List<Rep> Reps = new List<Rep>(6);

Однако, если вы хотите, чтобы ваш список содержал ненулевые объекты при его создании, вы можете создать список следующим образом:

public static List<Rep> Reps = new List<Rep>() 
{
    new Rep(),
    new Rep(),
    new Rep(),
    new Rep(),
    new Rep(),
    new Rep()
};
4 голосов
/ 21 февраля 2010

Исходный размер установлен правильно, проблема заключается в том, что вы указали в списке.

Выражение new Rep[6] создает массив с шестью записями, но оно не будет создавать Rep экземпляров для записей, вместо этого они будут установлены в null.

Итак, вы получите список, содержащий шесть нулевых ссылок, а не список, содержащий ссылки на шесть Rep экземпляров. Когда вы пытаетесь использовать свойство Main элемента в списке, вы получаете исключение нулевой ссылки.

Если вы хотите, чтобы экземпляры создавались, вы должны специально создать их:

public static List<Rep> Reps = new List<Rep>() {
  new Rep(),
  new Rep(),
  new Rep(),
  new Rep(),
  new Rep(),
  new Rep()
};
3 голосов
/ 21 февраля 2010

Ваш список инициализирован с 6 нулевыми ссылками.

Вы должны назначить новый Rep каждой позиции.

Попробуйте:

    public static List<Rep> Reps = 
        new List<Rep>(new Rep[]{ 
            new Rep(),
            new Rep(),
            new Rep(),
            new Rep(),
            new Rep(),
            new Rep() });  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...