Bog'liq Delegatlar, hodisalar va lyambda-ifodalar-hozir.org
Bu-oddiy-test.
Satr:
Buoddiytest.
Satr:
.tset yiddo uB Dastur tahlili:
Endi e’tiboringizni Main metodidagi ba’zi qismlarga qaratmoqchiman.
StrMod strOp = new StrMod(ReplaceSpaces); ReplaceSpace metodimiz StrMod delagatimiz bilan bir xil strukturaga ega bo’lishi lozim. Bu yerda, StrMod delegatimiz o’z navbatida ReplaceSpaces metodini chaqirmoqda.
str = strOp(“Bu oddiy test."); Bu kod yordamida esa, “Bu oddiy test.“ satri ReplaceSpaces metodiga yuborilmoqda.
strOp = new StrMod(RemoveSpaces); str = strOp(" Bu oddiy test."); Bu holatda esa, delegat yordamida RemoveSpaces metodi ishga tushdi. strOp = new StrMod(Reverse); str = strOp(" Bu oddiy test."); Bunda esa, Reverse metodi chaqirilmoqda.
Demak, delegat yordamida chaqirilayotgan metod
delegat bilan bir xil strukturaga ega bo’lishi lozim ekan! Hodisalar.
Umuman olganda, hodisa ro'y beradigan alohida bir narsadir. Masalan, Microsoft dasturchilarga yangi yoki mavjud mahsulotlarning xususiyatlari haqida xabardor qilish uchun hodisa uyushtiradi. Microsoft dasturchilarni hodisa haqida elektron pochta yoki boshqa reklama parametrlari orqali xabardor qiladi. Shunday qilib, bu holda, Microsoft hodisani tashkil etgan va bu haqida dasturchilarni xabardor qiladigan nashriyotdir, dasturchilar ushbu hodisaga obuna bo’ladilar va tadbirda qatnashadilar.
C # dagi voqealar shunga o'xshash kontseptsiyaga amal qiladi. Hodisada noshir, obunachi, xabar va hodisani o’tkazuvchi mavjud. Odatda, UI nazorati hodisalardan keng foydalanadi. Masalan, Windows formda tugmalarni boshqarish tugmachani bosish, sichqonchani bosish va boshqalar kabi bir nechta hodisaga ega. Maxsus sinf shuningdek, boshqa obunachilar sinflariga sodir bo'lgan yoki yuz berayotgan narsa to'g'risida xabar berish uchun hodisa o'tkazishi mumkin. Keling, qanday qilib hodisani aniqlay olishingizni va hodisalarni boshqaradigan boshqa sinflarga qanday xabar berishingizni ko'rib chiqaylik.
Hodisa faqat kapsulali delegatdan boshqa narsa emas. Oldingi bo'limda bilib olganimizdek, vakil bu ma'lumotnoma turidagi ma'lumotnoma turi. Siz quyida ko'rsatilgan tarzda delegatni e'lon qilishingiz mumkin:
Hodisa faqat kapsulali delegatdan boshqa narsa emas. Oldingi bo'limda bilib olganimizdek, vakil bu ma'lumotnoma turidagi ma'lumotnoma turi. Siz quyida ko'rsatilgan tarzda delegatni e'lon qilishingiz mumkin:
public delegate void someEvent(); public someEvent someEvent; Hodisani event kalit so’zi bilan e’lon qilgandan keyin delegat tipidagi o’zgaruvchilar quyidagi tarzda e’lon qilinadi.
public delegate void someEvent(); public event someEvent someEvent; Shunday qilib, delegat-event kalit so’zidan foydalangan holda hodisa bo’lib keladi.
Keling, biron bir hodisaning amaliy misolini ko'rib chiqaylik.
2-Masala. Son, pul, o'nlik, harorat va o'n oltilik kabi har xil formatlarda butun sonlarni chiqaradigan quyidagi PrintHelper klassini ko'rib chiqing. U beforePrintEvent orqali raqamni chop etishdan oldin, BeforePrint hodisasi a’zosiga xabar bersin.
public class PrintHelper { // declare delegate public delegate void BeforePrint(); //declare event of type delegate public event BeforePrint beforePrintEvent; public PrintHelper() { } public void PrintNumber(int num) {
public void PrintNumber(int num) {
//call delegate method before going to print
if (beforePrintEvent != null) beforePrintEvent();
Console.WriteLine("Number: {0,-12:N0}", num);
}
public void PrintDecimal(int dec) {
if (beforePrintEvent != null) beforePrintEvent();
Console.WriteLine("Decimal: {0:G}", dec);
}
public void PrintMoney(int money) {
if (beforePrintEvent != null) beforePrintEvent();
Console.WriteLine("Money: {0:C}", money);
}
public void PrintTemperature(int num) {
public void PrintTemperature(int num) {
if (beforePrintEvent != null) beforePrintEvent(); Console.WriteLine("Temperature: {0,4:N1} F", num);
}
public void PrintHexadecimal(int dec) {
if (beforePrintEvent != null) beforePrintEvent();
Console.WriteLine("Hexadecimal: {0:X}", dec);
}
}
Dastur tahlili:
PrintHelper beforePrint hodisasini nashr qiluvchi nashriyotchi klassdir. Shuni ta’kidlash joizki, har bir chiqaruvchi metod avvalo, beforePrintEvent nolga teng emasligini tekshiradi va shundan keyin beforePrintEvent() metodini chaqiradi. beforePrintEvent bu BeforePrint delegati tipidagi obyektdir. Shu bois, hech bir klass hodisaga a’zo bo’lmasa u nolga teng bo’lishi mumkin, shuning uchun ham delegat chaqirilishdan oldin u nolga teng emasligi tekshiriladi.
Lyambda ifodalar.
Lyambda ifodalarni tushunishdan oldin anonim metodlar bilan tanishib olishingiz lozim bo’ladi. Keyingi darsimizda anonim metodlar bilan tanishtiraman va shundan keyin lyambda ifodalar bilan to’liq tanishib chiqamiz.