В Visual Basic .NET и Visual C# имеется специальный синтаксис для перебора эле- ментов массивов и наборов в цикле. Оператор For Each (foreach) позволяет пооче- редно обработать все элементы массива или набора. Это делается следующим обра- зом:
Свойства позволяют сделать доступ к значениям и объектам — членам класса, бо- лее устойчивым к ошибкам, чем при использовании обычных полей. В сущности, свойство — это специальный метод, внешне напоминающий поле. Значения свойств устанавливают и читают так же, как значения полей:
Иногда необходимо создать свойство, значение которого клиент получит, но не сможет модифицировать после того, как оно было установлено во время инициа- лизации класса. Еще реже требуются свойства, которые не доступны для чтения, но доступны для модификации. Такие свойства называют соответственно свойстиами, доступными только для чтения (read-only) и только для записи (write-only). Создание свойств, доступных только для чтения
Как правило, разработчики создают свойства, возвращающие единственное значе- ние или объект. В Visual Basic .NET можно создавать свойства, которые принимают параметры. Как правило, такие свойства возвращают диапазон (или массив) значе- ний. Рассмотрим для примера объект Engine, представляющий двигатель («engine» по-английски — двигатель). У реального двигателя может быть несколько цилинд- ров, аналогично объект Engine включает несколько объектов Cylinder. Чтобы не пи- сать код для доступа к каждому из этих объектов, создают свойство Cylinder, полу- чающее или устанавливающее значение любого объекта Cylinder в зависимости от переданного параметра.
Компоненту, написанному на Visual Basic .NET, допустимо назначить свойство по умолчанию. Оно непременно должно быть параметризованным. Обычно это свой- ство возвращает диапазон, массив или набор значений. Назначать объекту свой- ство по умолчанию имеет смысл, только если его основной функцией является хра- нение других объектов и предоставление к ним доступа.
Если объект должен предоставлять доступ к набору однотипных элементов, число которых заранее неизвестно, можно сделать этот набор доступным через свойство объекта. Сделав набор объектов доступным через свойство класса, вы сможете упра- влять доступом к этим объектам и проверять значения, которые записываются в это свойство.
Делегаты — это особые классы, обеспечивающие работу событий. В сущности, де- легат — это указатель на функцию, обеспечивающий контроль типов. Он позволяет передавать ссылку на точку входа метода и исполнять этот метод без традиционно- го явного вызова. При объявлении делегата указывают сигнатуру вызываемого им метода и тип возвращаемого результата:
Уже говорилось, что у форм и элементов управления есть члены-события, ко- торые генерируются в соответствующих обстоятельствах. Например, событие Click генерируется в ответ на щелчок мышью. В классах можно объявлять собственные события и генерировать их при необходимости.
Чтобы генерировать объявленное событие, необходимо связать с ним один или не- сколько обработчиков. Обработчик события — это метод, который вызывается по- средством делегата всякий раз, когда генерируется соответствующее событие. Что- бы этот механизм работал, необходимо связать обработчики с обрабатываемыми событиями. Если в программе на Visual Basic .NET генерировать событие, с кото- рым не связан ни один обработчик, попросту ничего не произойдет; в Visual C# же подобные действия закончатся ошибкой.
Можно создать метод, способный обрабатывать несколько событий. Обычно это требуется, если несколько экземпляров класса или элементов управления генери- руют одинаковые события. Например, если на форме расположена группа кнопок, выполняющих сходные функции в приложении, стоит создать единственный ме- тод, который будет обрабатывать событие Click для всех этих кнопок. Кнопку, гене- рировавшую событие, определяют по значению параметра sender.