Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Vse_shpory_po_OOP_polnye.doc
Скачиваний:
6
Добавлен:
20.09.2019
Размер:
295.94 Кб
Скачать

15. Атрибуты. Назначение атрибутов. Базовый класс атрибута. Аннотирование класса атрибутами.

Это специальные классы, объекты которых можно присоединить к другим классам. Посредствам такой технологии можно связывать дополнительную информацию с классами или членами классов на этапе компиляции.

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

Атрибуты указываются перед классами или элементом класса в [].

Базовым классом всех атрибутов является класс System.Attribute. Все стандартные или пользовательские атрибуты должны наследоваться от этого класса, и имя класса должно быть: <…> Attribute

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

Атрибуты часто используются для формирования дополнительной информации о сборке или приложении AssemblyInfo.cs

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

Наиболее популярные:

1) System.Diagnostics.ConditionalAttribute;

2) System.ObsoleteAttribute;

3) System.SerializableAttribute;

4) System.Reflection.AssemblyDelaySignAttribute;

5) XML [Node, Attribute, Iquore] Attribute.

Привязка объектов атрибутов к классам происходит неявным образом, в момент загрузки сборки.

16. Расширяющие методы.

Достаточно часто пользователю предлагается герметизированные классы. Эти классы обладают достаточно большой функциональностью. Но пользователю нужны другие методы, которые составляются на основе базовой общедоступной функциональности. Если наследование произвести нельзя, то и эти методы добавить в классы тоже нельзя. Технически обойти такую сложность можно с помощью статических методов с передачей объекта в качестве параметра. Но синтаксически это не выглядит как программирование в ООП стиле.

Расширяющий метод – это просто особый синтаксис статического метода.

Пример расширяющего метода (может находится только в статическом классе):

public static class ExtensionMethods

{

static StreamWriter writer = new StreamWriter(“log.txt”, true);

public static void SendToLog(this string str)

{writer.WriteLine(str);}

}

string myStr = “Моя строка”;

myStr.SendToLog();

Первый параметр в сигнатуре расширяющего метода указывается с ключевым словом this. Вызов в дальнейшем расширяющего метода осуществляется на объекте совместного типа, так как-будто это метод класса. Остальные параметры записываются как обычные параметры метода. Их и только их надо будет указать при вызове расширяющего метода.

17. Анонимные методы. Объявление и использование.

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

Чтобы избавиться от необходимости определения таких методов, как собственных методов класса, введены анонимные методы. Эти методы не имеют названий и определяются в том месте, где они, собственно, и нужны. Пример:

public static class Program

{

public static void Main()

{

Processor p = new Processor();

p.Strategy = delegate(int x) {return x * 2;}

int[] source = new int[10];

int[] y = p.Process(source);

p.Strategy = delegate(int x) {return x + 2;}

y = p.Process(source);

}

}

Определение анонимного метода аналогично определению обычного метода. Иногда можно даже не указывать передаваемые параметры при определении анонимного метода. При этом совместимость типа анонимного метода и делегата остаётся (p.Strategy = delegate {return 0;}).

При присваивании анонимного метода экземпляру делегата следует соблюдать несколько правил. Во-первых, типы параметров делегата должны быть совмести­мыми с типами параметров анонимного метода. Иногда, если анонимный метод не имеет списка параметров (т.к. они не используются в методе), то он является преобразуемым к типу делегата со списком па­раметров до тех пор, пока этот список не включает никаких параметров out и ref. Если параметры out присутствуют, то анонимный метод обязан перечислить их в списке параметров в точке объявления.

Во-вторых, если анонимный метод перечисляет какие-то параметры в своем объявлении, их количество должно совпадать с параметрами типа делегата, и ка­ждый из их типов должен быть неявно преобразуемым к этим типам в объявлении делегата. И, наконец, тип возврата анонимного метода должен быть неявно преоб­разуемым к объявленному типу возврата делегата. Поскольку синтаксис объявле­ния анонимного метода явно не устанавливает типа возврата, компилятор должен проверить каждый оператор return и убедиться, что он возвращает тип, отвечаю­щий правилам преобразования.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]