Книга: C# для профессионалов. Том II

Массивы объектов

Важным достоинством ссылок, способных указывать на экземпляры производных классов, является то, что можно формировать массивы объектных ссылок, где различные объекты массива имеют различные типы. Это аналогично ситуации в Visual Basic, где можно сформировать массив ссылок на интерфейсы и не беспокоиться о том факте, что эти интерфейсные ссылки реализуются совершенно различными классами объектов.

Мы не видели еще, как C# работает с массивами, поэтому перепишем код классов Employee и Manager, чтобы сформировать массив объектных ссылок. Этот пересмотренный код можно также загрузить с web-сайта издательства Wrox Press, как пример EmployeeMaragerWithArrays. Новый код выглядит следующим образом:

public MainForm() {
 InitializeComponent();
 Employee Britney = new Employee("Britney Spears", 20000.00M);
 Employee Elton = new Manager("Elton John", 50000.00M);
 Manager Ginger = new Manager("Geri Halliwell", 50000.00M, 20000.00M);
 Employee[] Employees = new Employee[3];
 Employees[0] = Britney;
 Employees[1] = Elton;
 Employees[2] = Ginger;
 for (int I = 0; I < 3; I++) {
  this.listBox1.Items.Add(Employees[I].Name);
  this.listBox1.Items.Add(Employees[I].ToString());
  this.listBox1.Items.Add("");
 }
}

Мы вызываем свойство Name и метод ToString() каждого элемента массива. Выполнение кода создает следующий результат.


Приведенный код показывает, что C# при работе с массивами использует квадратные скобки. Это означает, что в отличие от VB, не существует опасности какой-либо путаницы между массивом и вызовом метода или функции. Синтаксис для объявления массива выглядит так:

Employee[] Employees = new Employee[3];

Мы видим, что массив переменных некоторого тип объявляют, помещая квадратные скобки после имени типа. Массив в C# всегда считается ссылочным объектом (даже если его элементы являются простыми типами, как int или double), поэтому на самом деле существует два этапа: объявление ссылки и создание экземпляра массива. Чтобы сделать это понятнее, разделим приведенную выше строку кода следующим образом:

Employee[] Employees;
Employees = new Employee[3];

He существует разницы между тем, что делается здесь и созданием экземпляров объектов, за исключением того, что используются квадратные скобки для указания, что это массив. Отметим также, что размер массива определяется, когда создается экземпляр объекта, сама ссылка не содержит данных о размере массива — только его размерность. Размерность определяется любым количеством запятых в объявлении массива, поэтому, например, если надо объявить двухмерный, 3?4 массив чисел типа double, можно написать:

double [,] DoubleArray = new double[3, 4];

Есть и другие несущественные различия в синтаксисе объявления массивов, но мы будем придерживаться приведенных здесь правил. Когда имеется массив, то значения его элементам присваиваются обычным образом. Отметим, однако, одно различие между C# и VB, состоящее в том, что C# всегда начинает с элемента с индексом 0. В VB имеется возможность изменить его на индекс 1, используя инструкцию Option Base. Также в VB можно определить любую нижнюю границу для любого конкретного массива. Но это свойство не добавляет на самом деле никаких преимуществ и может снизить производительность, так как это означает, что при любом доступе к элементу массива в VB, код должен выполнить дополнительную проверку, чтобы определить, какова нижняя граница массива. C# такое действие не поддерживает.

В приведенном выше коде после инициализации элементов массива мы перебираем их в цикле. Необычный синтаксис цикла for будет скоро рассмотрен.

Отметим, что поскольку массив был объявлен как массив объектов Employee, то можно получить доступ только к тем членам каждого объекта, которые определены для класса Employee. Если требуется доступ к свойству Bonus любого объекта массива, то необходимо сначала преобразовать соответствующую ссылку в ссылку Manager, что будет означать проверку того, что объект на самом деле является менеджером. Это не трудно сделать, но данный вопрос находится за пределами рассмотрения настоящего приложения.

С другой стороны, хотя используются ссылки Employee, мы всегда выбираем правильную версию метода ToString(). Если указанный объект является объектом Manager, то при вызове метода ToString() для этого объекта будет выполняться версия метода ToString(), определенная в классе Manager. В этом состоит достоинство перезагрузки методов в C#. Можно заменить некоторые методы в производном классе и знать, что независимо от того, какой ссылочный тип используется для доступа к этому объекту, для него всегда будет выполняться правильный метод.

Оглавление книги

Оглавление статьи/книги

Генерация: 0.911. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз