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?");
}
}
Do'stlaringiz bilan baham: |