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


Обратный.вызов.статических.методов Обратный вызов статических методов



Download 6,27 Mb.
Pdf ko'rish
bet318/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   314   315   316   317   318   319   320   321   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C

437
Обратный.вызов.статических.методов
Обратный вызов статических методов
Теперь, когда мы разобрали принцип работы метода 
Counter
, рассмотрим процедуру 
использования делегатов для вызова статических методов. Для примера возьмем 
метод 
StaticDelegateDemo
из представленного в предыдущем разделе кода.
Метод 
StaticDelegateDemo
вызывает метод 
Counter
, передавая в третьем па-
раметре 
fb
значение 
null
. В результате при обработке элементов не задействуется 
метод обратного вызова.
При втором вызове метода 
Counter
методом 
StaticDelegateDemo
третьему па-
раметру передается только что созданный делегат 
Feedback
. Этот делегат служит 
оболочкой для другого метода, позволяя выполнить обратный вызов последнего 
косвенно, через оболочку. В рассматриваемом примере имя статического метода 
Program.FeedbackToConsole
передается конструктору 
Feedback
, указывая, что 
именно для него требуется создать оболочку. Возвращенная оператором 
new
ссылка 
передается третьему параметру метода 
Counter
, который в процессе выполнения 
будет вызывать статический метод 
FeedbackToConsole
. Последний же просто вы-
водит на консоль строку с названием обрабатываемого элемента.
ПриМеЧание
Метод.FeedbackToConsole.определен.в.типе.Program.как.закрытый,.но.при.этом.мо-
жет.быть.вызван.методом.Counter .Так.как.оба.метода.определены.в.пределах.одного.
типа,.проблем.с.безопасностью.не.возникает .Но.даже.если.бы.метод.Counter.был.
определен.в.другом.типе,.это.не.сказалось.бы.на.работе.коде .Другими.словами,.
если.код.одного.типа.вызывает.посредством.делегата.закрытый.член.другого.типа,.
проблем.с.безопасностью.или.уровнем.доступа.не.возникает,.если.делегат.создан.
в.коде,.имеющем.нужный.уровень.доступа 
Третий вызов метода 
Counter
внутри метода 
StaticDelegateDemo
отличается 
от второго тем, что делегат 
Feedback
является оболочкой для статического метода 
Program.FeedbackToMsgBox
. Именно метод 
FeedbackToMsgBox
создает строку, 
указывающую на обрабатываемый элемент, которая затем выводится в окне в виде 
сообщения.
В этом примере ничто не нарушает безопасность типов. К примеру, при соз-
дании делегата 
Feedback
компилятор убеждается в том, что сигнатуры методов 
FeedbackToConsole
и 
FeedbackToMsgBox
типа 
Program
совместимы с сигнатурой 
делегата. Это означает, что оба метода будут принимать один и тот же аргумент 
(типа 
Int32
) и возвращать значение одного и того же типа (
void
). Однако попро-
буем определить метод 
FeedbackToConsole
вот так:
private static Boolean FeedbackToConsole(String value) {
...
}
В этом случае компилятор выдаст сообщение об ошибке (сигнатура метода 
FeedbackToConsole
не соответствует типу делегата):
error CS0123: No overload for 'FeedbackToConsole' matches delegate 'Feedback'


438
Глава.17 .Делегаты
Как C#, так и CLR поддерживают ковариантность и контравариантность ссылоч-
ных типов при привязке метода к делегату. 
Ковариантность
(covariance) означает, 
что метод может возвратить тип, производный от типа, возвращаемого делегатом. 
Контравариантность
(contra-variance) означает, что метод может принимать па-
раметр, который является базовым для типа параметра делегата. Например:
delegate Object MyCallback(FileStream s);
Определив делегат таким образом, можно получить экземпляр этого делегата, 
связанный с методом, прототип которого выглядит примерно так:
String SomeMethod(Stream s);
Здесь тип значения, возвращаемого методом 
SomeMethod
(тип 
String
), является 
производным от типа, возвращаемого делегатом (
Object
); такая ковариантность 
разрешена. Тип параметра метода 
SomeMethod
(тип 
Stream
) является базовым 
классом для типа параметра делегата (
FileStream
); такая контравариантность 
тоже разрешена.
Обратите внимание, что ковариантность и контравариантность поддерживаются 
только для ссылочных типов, но не для значимых типов или значения 
void
. К при-
меру, связать следующий метод с делегатом 
MyCallback
невозможно:
Int32 SomeOtherMethod(Stream s);
Несмотря на то что тип значения, возвращаемого методом 
SomeOtherMethod
(то есть 
Int32
), является производным от типа значения, возвращаемого методом 
MyCallback
(то есть 
Object
), такая форма ковариантности невозможна, потому что 
Int32
— это значимый тип. Значимые типы и 
void
не могут использоваться кова-
риантно и контравариантно, потому что их структура памяти меняется, в то время 
как для ссылочных типов структурой памяти в любом случае остается указатель. 
К счастью, при попытке выполнить запрещенные действия компилятор возвращает 
сообщение об ошибке.

Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   314   315   316   317   318   319   320   321   ...   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