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



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

Методы расширения
Механизм методов расширения лучше всего рассматривать на конкретном примере. 
В главе 14 я упоминаю о том, что для управления строками класс 
StringBuilder
предлагает меньше методов, чем класс 
String
, и это довольно странно, потому 
что класс 
StringBuilder
является предпочтительнее для управления строками, 
так как он изменяем. Допустим, вы хотите определить некоторые отсутствующие 
в классе 
StringBuilder
методы самостоятельно. Возможно, вы решите определить 
собственный метод 
IndexOf
:
public static class StringBuilderExtensions {
public static Int32 IndexOf(StringBuilder sb, Char value) {
for (Int32 index = 0; index < sb.Length; index++)
if (sb[index] == value) return index;
return -1;
}
}
После того как метод будет определен, его можно использовать в программах:
// Инициализирующая строка
StringBuilder sb = new StringBuilder("Hello. My name is Jeff.");
// Замена точки восклицательным знаком
// и получение номера символа в первом предложении (5)
Int32 index = StringBuilderExtensions.IndexOf(sb.Replace('.', '!'), '!');


235
Методы.расширения
Этот программный код работает, но в перспективе он не идеален. Во-первых, про-
граммист, желающий получить индекс символа при помощи класса 
StringBuilder

должен знать о существовании класса 
StringBuilderExtensions
. Во-вторых, 
программный код не отражает последовательность операторов, представленных 
в объекте 
StringBuilder
, что усложняет понимание, чтение и сопровождение кода. 
Программистам удобнее было бы вызывать сначала метод 
Replace
, а затем метод 
IndexOf
, но когда вы прочитаете последнюю строчку кода слева направо, первым 
в строке окажется 
IndexOf
, а затем — 
Replace
. Вы можете исправить ситуацию 
и сделать поведение программного кода более понятным, написав следующий код:
// Замена точки восклицательным знаком
sb.Replace('.', '!');
// Получение номера символа в первом предложении (5)
Int32 index = StringBuilderExtensions.IndexOf(sb, '!');
Однако здесь возникает третья проблема, затрудняющая понимание логики 
кода. Использование класса 
StringBuilderExtensions
отвлекает программиста 
от выполняемой операции: 
IndexOf
. Если бы класс 
StringBuilder
определял 
собственный метод 
IndexOf
, то представленный код можно было бы переписать 
следующим образом:
// Замена точки восклицательным знаком
// и получение номера символа в первом предложении (5)
Int32 index = sb.Replace('.', '!').IndexOf('!');
В контексте сопровождения программного кода это выглядит великолепно! 
В объекте 
StringBuilder
мы заменяем точку восклицательным знаком, а затем 
находим индекс этого знака.
А сейчас я попробую объяснить, что именно делают методы расширения. Они 
позволяют вам определить статический метод, который вызывается посредством 
синтаксиса экземплярного метода. Иначе говоря, мы можем определить собствен-
ный метод 
IndexOf
— и три проблемы, упомянутые выше, исчезнут. Для того чтобы 
превратить метод 
IndexOf
в метод расширения, мы просто добавим ключевое слово 
this
перед первым аргументом:
public static class StringBuilderExtensions {
public static Int32 IndexOf(this StringBuilder sb, Char value) {
for (Int32 index = 0; index < sb.Length; index++)
if (sb[index] == value) return index;
return -1;
}
}
Компилятор увидит следующий код:
Int32 index = sb.IndexOf('X');
Сначала он проверит класс 
StringBuilder
или все его базовые классы, предо-
ставляющие экземплярные методы с именем 
IndexOf
и единственным параметром 


236
Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   165   166   167   168   169   170   171   172   ...   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