Delegatlar, hodisalar va lyambdalar


Usul havolasini o‘rnatish


Download 50.88 Kb.
bet2/2
Sana16.11.2023
Hajmi50.88 Kb.
#1782138
1   2
Bog'liq
Delegatlar

Usul havolasini o‘rnatish
Yuqorida Delegat o‘zgaruvchisi usul to‘g‘ridan to‘g‘ri o‘zlashtirilgan. Yana bir usul – zarur usulni o‘zlashtirish bilan konstruktor yordamida delegat ob’ektini yaratish:
class Program
{
delegate int Operation(int x, int y);
static void Main(string[] args)
{
Operation del = Add;
Operation del2 = new Operation(Add);
Console.Read();
}
private static int Add(int x, int y) { return x + y; }
}
Ikkala usulda ham teng.


Uslublarning delegatga muvofiqligi
Yuqorida yozilganidek, agar ular bir xil qaytariladigan turga va bir xil parametrlar to‘plamiga ega bo‘lsa usullar delegatga muvofiq bo‘ladi. Biroq e’tiborga olish kerak, shuningdek, ref va out modifikatorlari ham e’tiborga olinadi. Masalan, bizda delegat bo‘lsin:
delegate void SomeDel(int a, double b);
Ikkala usulda ham teng.


Uslublarning delegatga muvofiqligi
Yuqorida yozilganidek, agar ular bir xil qaytariladigan turga va bir xil parametrlar to‘plamiga ega bo‘lsa usullar delegatga muvofiq bo‘ladi. Biroq e’tiborga olish kerak, shuningdek, ref va out modifikatorlari ham e’tiborga olinadi. Masalan, bizda delegat bo‘lsin:
delegate void SomeDel(int a, double b);
Mazkur delegatga, masalan, quyidagi usul mos keladi:
void SomeMethod1(int g, double n) { }
Quyidagi usullar esa muvofiq EMAS:
int SomeMethod2(int g, double n) { }
void SomeMethod3(double n, int g) { }
void SomeMethod4(ref int g, double n) { }
void SomeMethod5(out int g, double n) { g = 6; }

Bu erda SomeMethod2 usuli delegat turidan farq qilinadigan boshqa qaytariladigan turga ega. SomeMethod3 boshqa parametrlarga ega. SomeMethod4 va SomeMethod5 parametrlari ham delegat parametrlaridan farq qiladi, qhuningdek, ref va out modifikatorlariga ega.


Delegatga usullarni qo‘shish
Yuqori misollarda delegat o‘zgaruvchisi bir usulni ko‘rsatgan. Haqiqatda delegat bir xil signaturaga va qaytaradigan turga ega bo‘lgan ko‘plab usullarni ko‘rsatishi mumkin. Delegatdagi barcha usullar maxsus ro‘yxatga olinadi , ya’ni chaqirish ro‘yxati yoki invocation list. Delegat chaqirilganda ushbu ro‘yxatdan barcha usullar ketma-ket chaqiriladi. Biz ushbu tizimga bir emas, balki bir necha usullarni qo‘shishimiz mumkin:
class Program
{
delegate void Message();

static void Main(string[] args)


{
Message mes1 = Hello;
mes1 + = HowAreYou ;//endi mes1 ikki usulni koʻrsatadi
mes1 () ;//ikkala usulda ham chaqiriladi - Hello va HowAreYou
Console.Read();
}
private static void Hello()
{
Console.WriteLine("Hello");
}
private static void HowAreYou()
{
Console.WriteLine("How are you?");
}
}
Ushbu holatda Hello va HowAreYou nomli ikki usul ro‘yxatga qo‘shiladi. Shuningdek, shu usullarning ikkalasi ham chaqiriladi.

Delegatlarni qo‘shish uchun + = operatsiyasi qo‘llaniladi. Biroq ta’kidlash joizki, haqiqatda delegatning eski nusxasi usullari va yangi usul oladigan yangi ob’ekti yaratiladi va yangi yaratilgan deleagat ob’ekti mes1 o‘zgaruvchi ob’ektiga beriladi.


Delegatlarni qo‘shishda ham e’tiborga olish kerakki, biz bir xil usulga havolani bir necha marta qo‘shishimiz mumkin, shunda delegatni chaqirish ro‘yxatida bir xil usulga bir nechta bog‘liq bo‘ladi. Shuningdek, delegat chaqirilganda qo‘shimcha usul qancha qo‘shilsa shuncha ko‘p marta chaqiriladi:


Message mes1 = Hello;
mes1 += HowAreYou;
mes1 += Hello;
mes1 += Hello;
mes1();
Shu tariqada biz delegatdan usulni o‘chirishimiz ham mumkin - =:
static void Main(string[] args)
{
Message mes1 = Hello;
mes1 += HowAreYou;
mes1 () ;//mes1
mes1 - = HowAreYou ;//usulni olib tashlayman HowAreYou
mes1 () ;//Hello usuli chaqiriladi

Console.Read();


}
O‘chirishda e’tiborga olish kerakki, agar delegat bir xil usulga bir nechta havolani o‘z ichiga olgan bo‘lsa, - = operatsiyasi delegat chaqirish ro‘yxati oxiridan qidirishni boshlaydi va faqat birinchi topilgan kirishni olib tashlaydi. Agar delegatni chaqirish ro‘yxatida bunday usul yo‘q bo‘lsa, amal – = hech qanday samaraga ega emas.

Delegatlar birlashtirish


Delegatlarni boshqa delegatlarga birlashtirish mumkin. Masalan:
class Program
{
delegate void Message();

static void Main(string[] args)


{
Message mes1 = Hello;
Message mes2 = HowAreYou;
Message mes3 = mes1 + mes2 ;//delegatlarni birlashtiramiz
mes3 () ;//mes1 va mes2-dan barcha usullar chaqiriladi

Console.Read();


}
private static void Hello()
{
Console.WriteLine("Hello");
}
private static void HowAreYou()
{
Console.WriteLine("How are you?");
}
}
Download 50.88 Kb.

Do'stlaringiz bilan baham:
1   2




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