Net framework 5, а также среды Visual Studio 2012 и C#



Download 6,27 Mb.
Pdf ko'rish
bet327/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   323   324   325   326   327   328   329   330   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C


Глава.17 .Делегаты
getStatus += new GetStatus(new Speaker().Volume);
// Сводный отчет о состоянии трех компонентов
Console.WriteLine(GetComponentStatusReport(getStatus));
}
// Метод запрашивает состояние компонентов и возвращает информацию
private static String GetComponentStatusReport(GetStatus status) {
// Если цепочка пуста, ничего делать не нужно
if (status == null) return null;
// Построение отчета о состоянии
StringBuilder report = new StringBuilder();
// Создание массива из делегатов цепочки
Delegate[] arrayOfDelegates = status.GetInvocationList();
// Циклическая обработка делегатов массива
foreach (GetStatus getStatus in arrayOfDelegates) {
try {
// Получение строки состояния компонента и добавление ее в отчет
report.AppendFormat("{0}{1}{1}", getStatus(), Environment.NewLine);
}
catch (InvalidOperationException e) {
// В отчете генерируется запись об ошибке для этого компонента
Object component = getStatus.Target;
report.AppendFormat(
"Failed to get status from {1}{2}{0} Error: {3}{0}{0}",
Environment.NewLine,
((component == null) ? "" : component.GetType() + "."),
getStatus.Method.Name,
e.Message);
}
}
// Возвращение сводного отчета вызывающему коду
return report.ToString();
}
}
Результат выполнения этого кода выглядит так:
The light is off
Failed to get status from Fan.Speed
Error: The fan broke due to overheating
The volume is loud


451
Обобщенные.делегаты
Обобщенные делегаты
Много лет назад, когда среда .NET Framework только начинала разрабатываться, 
в Microsoft ввели понятие делегатов. По мере добавления в FCL классов появлялись 
и новые типы делегатов. Со временем их накопилось изрядное количество. Только 
в библиотеке 
MSCorLib dll
их около 50. Вот некоторые из них:
public delegate void TryCode(Object userData);
public delegate void WaitCallback(Object state);
public delegate void TimerCallback(Object state);
public delegate void ContextCallback(Object state);
public delegate void SendOrPostCallback(Object state);
public delegate void ParameterizedThreadStart(Object obj);
Вы не заметили определенное сходство в отобранных мной делегатах? На самом 
деле они одинаковы: переменная любого из этих делегатов должна ссылаться на 
метод, получающий 
Object
и возвращающий 
void
. Соответственно весь этот набор 
делегатов не нужен — вполне можно обойтись одним.
Так как современная версия .NET Framework поддерживает обобщения, нам на 
самом деле нужно всего лишь несколько обобщенных делегатов (определенных 
в пространстве имен 
System
), представляющих методы, которые могут принимать 
до 16 аргументов:
public delegate void Action(); // Этот делегат не обобщенный
public delegate void Action(T obj);
public delegate void Action(T1 arg1, T2 arg2);
public delegate void Action(T1 arg1, T2 arg2, T3 arg3);
...
public delegate void Action(T1 arg1, ..., T16 arg16);
В .NET Framework имеются 17 делегатов 
Action
, от не имеющих аргументов 
вообще до имеющих 16 аргументов. Чтобы вызвать метод с большим количеством 
аргументов, придется определить собственного делегата, но это уже маловероятно.
Кроме делегатов 
Action
в .NET Framework имеется 17 делегатов 
Func
, которые 
позволяют методу обратного вызова вернуть значение:
public delegate TResult Func();
public delegate TResult Func(T arg);
public delegate TResult Func(T1 arg1, T2 arg2);
public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3);
...
public delegate TResult Func(T1 arg1, ..., T16 arg16);
Вместо определения собственных типов делегатов рекомендуется по мере воз-
можности использовать обобщенных делегатов; ведь это уменьшает количество 
типов в системе и упрощает код. Однако, если нужно передать аргумент по ссылке
используя ключевые слова 
ref
или 
out
, может потребоваться определение соб-
ственного делегата:
delegate void Bar(ref Int32 z);


452
Глава.17 .Делегаты
Аналогично нужно действовать в ситуациях, когда требуется передать делегату 
переменное число параметров при помощи ключевого слова 
params
, если вы хоти-
те задать значения по умолчанию для аргументов делегата или если потребуется 
установить ограничение для аргумента-типа.
При работе с делегатами, использующими обобщенные аргументы и возвращаю-
щими значения, не следует забывать про ковариантность и контравариантность, так 
как это расширяет область применения делегатов. Дополнительная информация 
по этой теме приведена в главе 12.

Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   323   324   325   326   327   328   329   330   ...   658




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish