Параметры и аргументы методов

Определение метода задает имена и типы любых необходимых параметров. Аргументы должны быть совместимыми с типом параметра, но имя параметра, используемое в коде вызова, не должно быть таким же, как параметр с именем, определенным в методе.

Передача по ссылке и передача по значению

Тип значения по ссылке можно передать с помощью ключевого слова ref.

Ссылочные типы передаются по ссылке. Изменения объекта, осуществляемые с помощью этой ссылки, будут доступны и в вызывающем методе.

Возвращаемые значения

Методы могут возвращать значения вызывающим их объектам. Если тип возвращаемого значения, указываемый перед именем метода, не равен void, для возвращения значения используется ключевое слово return. В результате выполнения инструкции с ключевым словом return, после которого указано значение нужного типа, вызвавшему метод объекту будет возвращено это значение. Кроме того, ключевое слово return останавливает выполнение метода

Чтобы использовать возвращаемое методом значение в вызываемом методе, вызов метода можно поместить в любое место кода, где требуется значение соответствующего типа. Кроме того, возвращаемое значение можно присвоить переменной.

События

События позволяют классу или объекту уведомлять другие классы или объекты о возникновении ситуаций. Класс, отправляющий событие, называется издателем, а классы, принимающие событие, называются подписчиками.

События имеют следующие свойства.

· Издатель определяет момент вызова события, подписчики определяют предпринятое ответное действие.

· У события может быть несколько подписчиков. Подписчик может обрабатывать несколько событий от нескольких издателей.

· События, не имеющие подписчиков, никогда не возникают.

· Обычно события используются для оповещения о действиях пользователя, таких как нажатия кнопок или выбор меню и их пунктов в графическом пользовательском интерфейсе.

· Если событие имеет несколько подписчиков, то при его возникновении происходит синхронный вызов обработчиков событий. Сведения об асинхронном вызове событий см. в разделе Асинхронный вызов синхронных методов.


· События можно использовать для синхронизации потоков.

· В библиотеке классов .NET Framework в основе событий лежит делегат EventHandler и базовый класс EventArgs.

Индексаторы

Индексаторы позволяют индексировать экземпляры класса или структуры так же, как массивы. Индексаторы напоминают свойства, но их методы доступа принимают параметры.

class SampleCollection<T>

{ private T[] arr = new T[100];

public T this[int i]

{ get { return arr[i]; }

set { arr[i] = value;} }}

Общие сведения об индексаторах

· Индексаторы позволяют индексировать объекты аналогично массивам.

· Метод доступа get возвращает значение. Метод доступа set присваивает значение.

· Ключевое слово this используется для определения индексаторов.

· Ключевое слово value используется для определения значения, присваиваемого методом set индексатора.

· Индексаторы не должны использовать в качестве индекса целочисленное значение; конкретный механизм поиска определяет разработчик.

· Индексаторы можно перегружать.

· Индексаторы могут иметь более одного формального параметра, например при доступе к двухмерному массиву.

Делегаты и обработчики событий

Одно из полезных нововведений в С# — делегаты (delegates). Делегаты являются управляемыми объектами и привязаны к типам. Исполняющая среда гарантирует, что делегат указывает на допустимый объект.

Использование делегатов в качестве методов обратного вызова

Методы обратного вызова повсеместно используются в Windows для передачи указателя функции другой функции, чтобы последняя могла вызвать первую (через переданный ей указатель).

Асинхронная обработка

Методы обратного вызова используют при асинхронной обработке, когда вызванному коду требуется существенное время для обработки запроса. Обычно сценарий таков. Клиентский код вызывает метод, передавая ему метод обратного вызова. Вызванный метод начинает работу в своем потоке и сразу возвращает управление. Запущенный поток затем выполняет основную работу, при необходимости обращаясь к функции обратного вызова. Достоинство такого подхода в том, что клиент продолжает работу, не блокируясь на потенциально длительное время.

Введение дополнительного кода в код класса

Другой распространенный способ применения методов обратного вызова имеет место, когда класс позволяет клиенту указать метод для дополнительной нестандартной обработки.