Основы программирования на C#


Массивы объектов - часть 2


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

public void TestWinners() { //массивы объектов int nwin = 3; Winners[] wins = new Winners[nwin]; string[] winames = {"Т. Хоар", "Н. Вирт", "Э. Дейкстра"};

В результате создан массив wins, состоящий из объектов класса Winners. Что произойдет, если попытаться задать значения полей объектов, вызвав специально созданный для этих целей метод SetVals? Рассмотрим фрагмент кода, осуществляющий этот вызов:

//создание значений элементов массива for(int i=0; i < wins.Length; i++) wins[i].SetVals(winames[i]);

На этапе выполнения будет сгенерировано исключение - нулевая ссылка. Причина понятна: хотя массив wins и создан, но это массив ссылок, имеющих значение null. Сами объекты, на которые должны указывать ссылки, не создаются в момент объявления массива ссылочного типа. Их нужно создавать явно. Ситуация аналогична объявлению массива массивов. И там необходим явный вызов конструктора для создания каждого массива на внутреннем уровне.

Как же создавать эти объекты? Конечно, можно возложить эту обязанность на пользователя, объявившего массив wins, - пусть он и создаст экземпляры для каждого элемента массива. Правильнее все-таки иметь в классе соответствующий метод. Метод должен быть статическим, чтобы его можно было вызывать еще до того, как созданы экземпляры класса, поскольку метод предназначен для создания этих самых экземпляров. Так в нашем классе появился статический метод InitAr:

//статический метод public static Winners[] InitAr(Winners[] Winar) { for(int i=0; i < Winar.Length; i++) Winar[i] = new Winners(); return(Winar); }//InitAr

Методу передается массив объектов, возможно, с нулевыми ссылками. Он возвращает тот же массив, но уже с явно определенными ссылками на реально созданные объекты. Теперь достаточно вызвать этот метод, после чего можно спокойно вызывать и метод SetVals. Вот как выглядит правильная последовательность вызовов методов класса Winners:

Winners.InitAr(wins); //создание значений элементов массива for(int i=0; i < wins.Length; i++) wins[i].SetVals(winames[i]); //печать значений элементов массива for(int i=0; i < wins.Length; i++) wins[i].PrintWinner(wins[i]); }//TestWinners




Начало  Назад  Вперед