Чтение онлайн

на главную - закладки

Жанры

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

Ватсон Карли

Шрифт:

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#. Можно заменить некоторые методы в производном классе и знать, что независимо от того, какой ссылочный тип используется для доступа к этому объекту, для него всегда будет выполняться правильный метод.

Цикл 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# действительно представляет полную свободу управления циклом в том виде, какой будет необходим для рассматриваемой задачи.

Поделиться:
Популярные книги

Девяностые приближаются

Иванов Дмитрий
3. Девяностые
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Девяностые приближаются

Громовая поступь. Трилогия

Мазуров Дмитрий
Громовая поступь
Фантастика:
фэнтези
рпг
4.50
рейтинг книги
Громовая поступь. Трилогия

Пипец Котенку!

Майерс Александр
1. РОС: Пипец Котенку!
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Пипец Котенку!

Мама из другого мира...

Рыжая Ехидна
1. Королевский приют имени графа Тадеуса Оберона
Фантастика:
фэнтези
7.54
рейтинг книги
Мама из другого мира...

Надуй щеки!

Вишневский Сергей Викторович
1. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки!

Идеальный мир для Лекаря 15

Сапфир Олег
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 15

Спасение 6-го

Уолш Хлоя
3. Парни из школы Томмен
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Спасение 6-го

По осколкам твоего сердца

Джейн Анна
2. Хулиган и новенькая
Любовные романы:
современные любовные романы
5.56
рейтинг книги
По осколкам твоего сердца

Медиум

Злобин Михаил
1. О чем молчат могилы
Фантастика:
фэнтези
7.90
рейтинг книги
Медиум

Я тебя не предавал

Бигси Анна
2. Ворон
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Я тебя не предавал

Найди меня Шерхан

Тоцка Тала
3. Ямпольские-Демидовы
Любовные романы:
современные любовные романы
короткие любовные романы
7.70
рейтинг книги
Найди меня Шерхан

Хроники сыска (сборник)

Свечин Николай
3. Сыщик Его Величества
Детективы:
исторические детективы
8.85
рейтинг книги
Хроники сыска (сборник)

(Не) моя ДНК

Рымарь Диана
6. Сапфировые истории
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
(Не) моя ДНК

Никто и звать никак

Ром Полина
Фантастика:
фэнтези
7.18
рейтинг книги
Никто и звать никак