Delegatlar, hodisalar va lyambdalar
Delegatlar
Delegatlar usullarni ko‘rsatadigan ob’ektlarni taqdim etadi. Ya’ni delegatlar – usullarga ko‘rsatkichlar va delegatlar yordamida biz ushbu usullarni chaqirishimiz mumkin.
Delegatlarni aniqlash
Delegatni e’lon qilish uchun delegate kalit so‘zidan foydalaniladi, shundan so‘ng qaytariladigan turi, nomi va parametrlar yoziladi. Masalan:
delegate void Message();
Message delegatining qaytariladigan turi sifatida void (ya’ni hech narsani qaytarmaydi) turi mavjud va hech qanday parametrlarni qabul qilmaydi. Demak, ushbu delegat hech qanday parametrlarni qabul qilmaydigan hech qanday qiymat qaytarmaydigan usulni ko‘rsatishi mumkin.
Ushbu delegatning qo‘llanilishini ko‘rib chiqamiz:
class Program
{
delegate void Message(); // 1. Delegatni e’lon qilamiz
static void Main(string[] args)
{
Message mes; // 2. Delegat o‘zgaruvchisini yaratamiz
if (DateTime.Now.Hour < 12)
{
mes = GoodMorning; // 3. Ushbu o‘zgaruvchiga usul manzili beramiz
}
else
{
mes = GoodEvening;
}
mes(); // 4. Usul chaqirilmoqda
Console.ReadKey();
}
private static void GoodMorning()
{
Console.WriteLine("Good Morning");
}
private static void GoodEvening()
{
Console.WriteLine("Good Evening");
}
}
Bu erda avvalo delegatni belgilaymiz:
delegate void Message(); // 1. Delegatni e’lon qilamiz
Bu holatda delegat sinf ichida aniqlanadi, biroq delegatni nomlar maydoni ichida sinfdan tashqari ham aniqlash mumkin.
Delegatdan foydalanish uchun ushbu delegatning o‘zgaruvchisi e’lon qilinadi:
Message mes; // 2. Delegat o‘zgaruvchisini yaratamiz
DateTime.Now.Hour xususiyatdan foydalanib, joriy soatni olamiz. Vaqtga qarab delegatga aniq usul manzili beriladi. E’tibor bering, ushbu usullar delegat bilan birga qaytariladigan qiymatlarga ega bo‘ladi.
mes = GoodMorning; // 3. Ushbu o‘zgaruvchiga usul manzili beramiz
Shundan so‘ng delegat orqali ushbu delegat bog‘liq bo‘lgan usulni chaqiramiz:
mes(); // 4. Usul chaqirilmoqda
Delegatni chaqirish usul chaqirishiga ko‘ra amalga oshiriladi.
Boshqa delegatga misol ko‘rib chiqamiz:
class Program
{
delegate int Operation(int x, int y);
static void Main(string[] args)
{
//usul manzilini kontruktor orqali belgilash
Operation del = Add ;//delegat Add usulini ko‘rsatadi
int result = del (4,5) ;//amalda Add (4, 5)
Console.WriteLine(result);
del = Multiply ;//endi delegat Multiply usulini ko‘rsatadi
result = del (4, 5) ;//amalda Multiply (4, 5)
Console.WriteLine(result);
Console.Read();
}
private static int Add(int x, int y)
{
return x+y;
}
private static int Multiply (int x, int y)
{
return x * y;
}
}
Bunda Operation delegati int turidagi qiymatni qaytaradi va ikkita int parametriga ega. Shuning uchun ushbu delegatga int turini qaytaradigan va int turidagi ikkita parametrlarni qabul qiladigan har qanday usul mos keladi. Bu holatda bu Add va Multiply usullari. Ya’ni biz ushbu usullarning har birini delegat o‘zgaruvchisiga o‘rnatib, chaqirishimiz mumkin.
Delegat int turidagi ikkita parametrlarni qabul qilayotgani uchun, u chaqirilganda ushbu parametrlar uchun int turidagi qiymatlarni uzatish kerak: del (4,5).
Delegatlar faqat delegat o‘zgaruvchisi shu sinfda belgilangan usullarni ko‘rsatishi shart emas. Bu boshqa sinf va strukturalar usullari ham bo‘lishi mumkin.
class Math
{
public int Sum(int x, int y) { return x + y; }
}
class Program
{
delegate int Operation(int x, int y);
static void Main(string[] args)
{
Math math = new Math();
Operation del = math.Sum;
int result = del(4, 5); // math.Sum(4, 5)
Console.WriteLine(result); // 9
Console.Read();
}
}
Do'stlaringiz bilan baham: |