Delegate void Message


Download 184.94 Kb.
bet1/11
Sana16.06.2023
Hajmi184.94 Kb.
#1516542
  1   2   3   4   5   6   7   8   9   10   11
Bog'liq
Amaliyot ishi Dasturlash texnologiyalari


Delegatlar.
Delegatlar usullarga ishora qiluvchi ob'ektlarni ifodalaydi. Ya'ni delegatlar usullarga ko'rsatgich bo'lib, delegatlar yordamida biz bu usullarni chaqirishimiz mumkin.
Delegat kalit so'zi delegatni e'lon qilish uchun ishlatiladi, undan keyin qaytish turi, nomi va parametrlari. Masalan:
delegate void Message();
Message delegati void qaytish turiga ega (ya'ni hech narsani qaytarmaydi) va hech qanday parametrlarni olmaydi. Bu shuni anglatadiki, bu delegat hech qanday parametrlarni olmaydigan va hech narsa qaytarmaydigan har qanday usulga ishora qilishi mumkin.
Ushbu delegatdan foydalanishni ko'rib chiqing:
Message mes; // 2. Delegat o'zgaruvchisini yaratish
mes = Hello; // 3. Ushbu o'zgaruvchiga metodning manzilini belgilash
mes(); // 4. Metodni chaqirish
void Hello() => Console.WriteLine("Hello World ");
delegate void Message(); // 1. Delegat e'lon qilish
Avvalo, delegatning o'zini aniqlashingiz kerak:
delegate void Message();
Delegatdan foydalanish uchun ushbu delegatning o'zgaruvchisi e'lon qilinadi:
Message mes;
Keyinchalik, ma'lum bir metodning manzili (bizning holatda, Hello metodi) delegatga uzatiladi. E'tibor bering, bu metod delegat bilan bir xil qaytish turiga va bir xil parametrlar to'plamiga ega (bu holda hech qanday parametr yo'q).
mes = Hello;
Keyin, delegat orqali biz ushbu delegat murojaat qiladigan metodni chaqiramiz:
mes();
Delegatni chaqirish metodni chaqirishga o'xshaydi. Biroq, delegatlar ixtiyoriy ravishda faqat delegat o'zgaruvchisi aniqlangan sinfda aniqlangan metodlarga ishora qilishi mumkin. Bu boshqa sinflar va tuzilmalarning metodlari ham bo'lishi mumkin.
Message message1 = Welcome.Print;
Message message2 = new Hello().Display;
message1(); // Welcome
message2(); // Hello
delegate void Message();
class Welcome
{
public static void Print() => Console.WriteLine("Welcome");
}
class Hello
{
public void Display() => Console.WriteLine("Hello");
}
Agar biz yuqori darajadagi dasturda delegatni aniqlasak, bu C# 10 dan boshlab standart Program.cs fayli, yuqoridagi misolda bo'lgani kabi, u holda, boshqa turlar kabi, delegat kod oxirida aniqlanadi. Lekin printsipial jihatdan delegat sinf ichida aniqlanishi mumkin:
class Program
{
delegate void Message();
static void Main()
{
Message mes;
mes = Hello;
mes();
void Hello() => Console.WriteLine("Hello World");
}
}
Yoki sinfdan tashqarida:
delegate void Message();
class Program
{
static void Main()
{
Message mes;
mes = Hello;
mes();
void Hello() => Console.WriteLine("Hello World ");
}
}
Parametrlarni oladigan va natijani qaytaradigan delegatni aniqlash va undan foydalanishni ko'rib chiqing:
Operation operation = Add;
int result = operation(4, 5);
Console.WriteLine(result);
operation = Multiply;
result = operation(4, 5);
Console.WriteLine(result);
int Add(int x, int y) => x + y;
int Multiply(int x, int y) => x * y;
delegate int Operation(int x, int y);
Bunday holda, Operatsiya vakili int qiymatini qaytaradi va ikkita int parametriga ega. Shuning uchun, bu delegat int qiymatini qaytaradigan va ikkita int parametrini oladigan har qanday usulga mos keladi. Bunday holda, bular Qo'shish va Ko'paytirish metodlari. Ya'ni, biz ushbu metodlardan istalganini delegat o'zgaruvchisiga belgilashimiz va chaqirishimiz mumkin.
Delegat int tipidagi ikkita parametrni olganligi sababli, u chaqirilganda siz ushbu parametrlar uchun qiymatlarni o'tkazishingiz kerak: operation (4,5).
Yuqorida delegat o'zgaruvchisi to'g'ridan-to'g'ri metodga tayinlangan. Boshqa yo'l bor - konstruktor yordamida delegat ob'ektini yaratish, unga kerakli metod o'tkaziladi:
Operation operation1 = Add;
Operation operation2 = new Operation(Add);
int Add(int x, int y) => x + y;
delegate int Operation(int x, int y);
Ikkala yo'l ham ekvivalentdir.
Yuqoridagi misollarda delegat o'zgaruvchisi bitta usulga ishora qildi. Aslida, delegat bir xil imzo va qaytish turiga ega bo'lgan bir nechta usullarni ko'rsatishi mumkin. Delegatdagi barcha usullar maxsus ro'yxatga kiradi - chaqiruv ro'yxati yoki chaqiruv ro'yxati. Va delegat chaqirilganda, ushbu ro'yxatdagi barcha usullar ketma-ket chaqiriladi. Va biz bu ro'yxatga bir emas, balki bir nechta usullarni qo'shishimiz mumkin. += operatori delegatga usullar qo'shish uchun ishlatiladi:
Message message = Hello;
message += HowAreYou;
message();
void Hello() => Console.WriteLine("Hello");
void HowAreYou() => Console.WriteLine("How are you?");
delegate void Message();
Bunday holda, ikki usul, Hello va HowAreYou, xabar vakilining chaqiruv ro'yxatiga qo'shiladi. Va xabar chaqirilganda, bu usullarning ikkalasi ham bir vaqtning o'zida chaqiriladi. Ammo shuni ta'kidlash joizki, haqiqatda yangi delegat ob'ekti yaratiladi, u delegatning eski nusxasi va yangi usulning usullarini oladi va yangi yaratilgan delegat ob'ekti xabar o'zgaruvchisiga tayinlanadi. Delegatlarni qo'shayotganda shuni yodda tutingki, biz bir xil usulga bir necha marta havola qo'shishimiz mumkin, keyin delegatlar chaqiruvi ro'yxatida bir xil usulga bir nechta havolalar bo'ladi. Shunga ko'ra, delegat chaqirilganda, qo'shilgan usul qancha qo'shilgan bo'lsa, shuncha chaqiriladi:
Message message = Hello;
message += HowAreYou;
message += Hello;
message += Hello;
message();
Konsolga chiqishi:


Download 184.94 Kb.

Do'stlaringiz bilan baham:
  1   2   3   4   5   6   7   8   9   10   11




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