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


расширение разных типов методами расширения



Download 6,27 Mb.
Pdf ko'rish
bet172/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   168   169   170   171   172   173   174   175   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C

расширение разных типов методами расширения
В этой главе я продемонстрировал, как определять методы расширения для класса 
StringBuilder
. Я хотел бы отметить, что так как метод расширения на самом деле 
является вызовом статического метода, то среда CLR не генерирует код для проверки 
значения выражения, используемого для вызова метода (равно ли оно 
null
).
// sb равно null
StringBuilder sb = null;
// Вызов метода выражения: исключение NullReferenceException НЕ БУДЕТ
// выдано при вызове IndexOf
// Исключение NullReferenceException будет вброшено внутри цикла IndexOf
sb.IndexOf('X');
// Вызов экземплярного метода: исключение NullReferenceException БУДЕТ 
// вброшено при вызове Replace
sb.Replace('.', '!');
Я также хотел бы отметить, что вы можете определять методы расширения для 
интерфейсных типов, как в следующем программном коде:
public static void ShowItems(this IEnumerable collection) {
foreach (var item in collection)
Console.WriteLine(item);
}
Представленный здесь метод расширения может быть вызван с использованием 
любого выражения, результат выполнения которого относится к типу, реализую-
щему интерфейс 
IEnumerable
:


239
Методы.расширения
public static void Main() {
// Показывает каждый символ в каждой строке консоли
"Grant".ShowItems();
// Показывает каждую строку в каждой строке консоли
new[] { "Jeff", "Kristin" }.ShowItems();
// Показывает каждый Int32 в каждой строчке консоли.
new List() { 1, 2, 3 }.ShowItems();
}
ВниМание
Методы.расширения.являются.краеугольным.камнем.предлагаемой.Microsoft.техно-
логии.Language.Integrated.Query.(LINQ) .В.качестве.хорошего.примера.класса.с.боль-
шим.количеством.методов.расширения.обратите.внимание.на.статический.класс.
System Linq Enumerable.и.все.его.статические.методы.расширения.в.документации.
Microsoft. NET.Framework.SDK .Каждый.метод.расширения.в.этом.классе.расширяет.
либо.интерфейс.IEnumerable,.либо.интерфейс.IEnumerable 
Методы расширения также можно определять и для типов-делегатов, напри-
мер:
public static void InvokeAndCatch(this Action d, Object o) 
where TException : Exception { 
try { d(o); } 
catch (TException) { } 
}
Пример вызова:
Action action = o => Console.WriteLine(o.GetType()); 
// Выдает NullReferenceException 
action.InvokeAndCatch(null);
// Поглощает NullReferenceException
Кроме того, можно добавлять методы расширения к перечислимым типам (при-
меры см. в главе 15).
Наконец, компилятор С# позволяет создавать делегатов, ссылающихся на метод 
расширения через объект (см. главу 17):
public static void Main () {
// Cоздание делегата Action, ссылающегося на статический метод расширения
// ShowItems; первый аргумент инициализируется ссылкой на строку "Jeff"
Action a = "Jeff".ShowItems;
.
.
.
// Вызов делегата, вызывающего ShowItems и передающего
// ссылку на строку "Jeff"
a();
}


240
Глава.8 .Методы
В представленном программном коде компилятор С# генерирует IL-код для того, 
чтобы создать делегата 
Action
. После создания делегата конструктор передается 
в вызываемый метод, также передается ссылка на объект, который должен быть 
передан в этот метод в качестве скрытого параметра. Обычно, когда вы создаете 
делегата, ссылающегося на статический метод, объектная ссылка равна 
null
, по-
тому что статический метод не имеет этого параметра. Однако в данном примере 
компилятор C# сгенерирует специальный код, создающий делегата, ссылающегося 
на статический метод 
ShowItems
, а целевым объектом статического метода будет 
ссылка на строку 
"Jeff"
. Позднее, при вызове делегата, CLR вызовет статический 
метод и передаст ему ссылку на строку 
"Jeff"
. Все это напоминает какие-то фо-
кусы, но хорошо работает и выглядит естественно, если не думать, что при этом 
происходит внутри.

Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   168   169   170   171   172   173   174   175   ...   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