C# для профессионалов. Том II
Шрифт:
Основные применения интерфейсов следующие:
□ Взаимодействовать и устанавливать обратную совместимость с компонентами COM.
□ Служить в качестве контракта для других классов .NET. Интерфейс может использоваться для указания, что класс реализует некоторые свойства. Например, цикл C# foreach
Делегаты
Делегаты в C# не имеют прямого эквивалента в C++ и выполняют ту же самую задачу, что и указатели на функции в C++. Идея делегата состоит в том, что указатель на метод помещается в специальный класс вместе со ссылкой на объект, на котором вызывается метод (для метода экземпляра или со ссылкой
Формально делегат является классом, который выводится из класса
Основное использование делегатов состоит в передаче и вызове ссылок на методы: ссылки на методы нельзя передавать непосредственно, но они могут передаваться внутри делегата. Делегат обеспечивает безопасность типа данных, не позволяя вызывать метод с неверной сигнатурой. Метод, который содержит делегат, может вызываться синтаксически как вызов делегата. Следующий код показывает общие принципы. Первое, необходимо определить класс делегата:
Затем, для целей этого примера объявим класс, который содержит вызываемый метод:
Еще позже, может быть при реализации некоторого другого класса, имеется метод, которому должна быть передана ссылка на метод с помощью делегата:
И, наконец, код, который реально использует делегата:
Или передать его в другой метод:
В частном случае, когда делегат представляет метод, который возвращает
События
События являются специальной формой делегатов, которые используются для поддержки модели уведомления о событии с помощью обратного вызова. Событие имеет следующую сигнатуру:
Это сигнатура, которую должен иметь любой обработчик событий с обратным вызовом. Ожидается, что
Для объявления события используется специальный синтаксис:
Клиенты используют синтаксис
Источник просто вызывает событие, когда потребуется, используя такой же синтаксис, который был показан выше для делегатов. Так как событие является широковещательным делегатом, то все обработчики событий будут вызваны в ходе этого процесса. События рассматриваются более подробно в главе 6.
Атрибуты
Концепция атрибутов не имеет эквивалента в ANSI C++, однако атрибуты поддерживаются компилятором Microsoft C++ как специальное расширение Windows. В версии C# имеются классы .NET, которые выводятся из
Атрибут | Описание |
---|---|
DllImport | Указывает, что метод определен во внешней DLL. |
StructLayout | Позволяет расположить содержимое структуры в памяти. Позволяет получить эквивалент union в C#. |
Obsolete | Создает ошибку компилятора или предупреждение, если используется этот метод. |
Conditional | Заставляет выполнить условную компиляцию. Этот метод и все ссылки на него будут игнорироваться, если присутствует определенный символ препроцессора. |