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#. Можно заменить некоторые методы в производном классе и знать, что независимо от того, какой ссылочный тип используется для доступа к этому объекту, для него всегда будет выполняться правильный метод.
Цикл for
Давайте теперь рассмотрим странный синтаксис цикла
for
. Этот цикл является эквивалентом C# для следующего кода VB:
Integer I
For I = 1 То 3
listBox1.Items.Add "Details of the Employee"
Next
Идея цикла
For
в VB состоит в том, что он начинается с инициализации некоторой переменной — управляющей переменной цикла, и каждый раз при проходе цикла что-то добавляется к управляющей переменной, пока она не превысит конечное значение. Это достаточно полезно, но не дает почти никакой гибкости в работе цикла. Хотя можно изменять значение приращения или даже сделать его отрицательным, используя возможности
Step
, цикл всегда работает с помощью вычислений, и проверка на выход из цикла всегда происходит по достижении переменной некоторого минимального или максимального значения.
В C# цикл
for
обобщает эту концепцию. Базовая идея цикла
for
в C# следующая. В начале цикла что-то делается, на каждом шаге цикла тоже что-то делается, чтобы перейти к следующей итерации, затем, чтобы определить, когда выходить из цикла, выполняется некоторая проверка. Сравнение версий Visual Basic и C# выглядит следующим образом:
VB
C#
В начале цикла
Инициализация
управляющей переменной цикла
Выполнить что-то
Проверка на выход из цикла
Не превысила ли переменная цикла некоторого значения?
Проверка некоторого условия
В конце каждой итерации
Увеличить управляющую переменную цикла
Выполнить что-то
Это может выглядеть как-то неопределенно, но зато дает большую гибкость. Например, в C# вместо добавления некоторой величины к управляющей переменной цикла на каждой итерации можно добавлять какое-то число, которое считывается из файла и которое изменяется на каждой итерации. Проверка не должна быть проверкой значения управляющей переменной цикла, это может быть проверка, например, достижения конца файла. Это позволяет при подходящем выборе начального действия, проверки и действия в конце каждой итерации циклу
for
эффективно выполнять те же задачи, что и любому из циклов VB —
For
,
Foreach
,
Do
и
While
, или цикл может вообще работать неким экзотическим образом, для которого нет простого эквивалента в VB. Цикл
for
в C# действительно представляет полную свободу управления циклом в том виде, какой будет необходим для рассматриваемой задачи.
Надо отметить, что C# поддерживает также циклы
foreach
,
do
и
while
для соответствующих ситуаций.
Давайте вернемся к точному синтаксису. Вспомним, что версия C# для приведенного выше цикла
for
выглядит следующим образом:
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("");
}
Как можно видеть, инструкция
for
получает три различные элемента внутри скобок. Эти элементы разделяются точкой с запятой:
□ Первый элемент является действием, которое выполняется прямо в начале цикла, чтобы инициализировать цикл. В данном случае объявляется и инициализируется управляющая переменная цикла.
□ Следующим элементом является условие, определяющее завершение цикла. В данном случае условие состоит в том, что I должно быть меньше 3. Цикл продолжается, пока это условие будет
true
, и закончится, как только условие станет
false
. Условие оценивается в начале каждой итерации, чтобы, если оно окажется
false
в самом начале, инструкция внутри цикла вообще не выполнялась.
□ В третьем элементе находится инструкция, которая выполняется в конце каждой итерации цикла. Циклы Visual Basic всегда работают, увеличивая некоторое число, и это как раз то, что делается в данном случае.
Синтаксис выглядит незнакомым, но после привыкания к нему, можно использовать цикл
for
очень эффективно. Например, предположим, что необходимо вывести все целые степени 2, которые меньше 4000, в окне списка. Запишем следующий код:
for (int I = 2; I < 4000; I *= 2)
listBox1.Items.Add(I.ToString);
Такой результат можно получить и в VB, но немного труднее. Для этого конкретного цикла в VB лучше воспользоваться циклом
while
.
Другие свойства C#
Мы закончили рассмотрение примеров. Оставшаяся часть приложения кратко рассматривает несколько свойств C#, о которых необходимо знать при выполнении перехода от VB к C#, и которые еще не рассматривались, в частности, некоторые из концепций C#, связанные с типами данных и операторами.