Agar funksiyani parametr sifatida uzatishni xohlasak nima bo'ladi? Qanday qilib C# callback funksiyalari yoki eventlarni boshqaradi?
Javob: Delegat
Delegat - bu metod imzosini belgilaydigan ma'lumot turi. Siz boshqa ma'lumotlar turi kabi delegatning o'zgaruvchilarini yaratishingiz mumkin va ular yordamida delegat bilan bir xil parametrga ega har qanday metodga murojaat qilishingiz mumkin.
Delegatlar bilan ishlashda uchta bosqich mavjud:
Delegatni e'lon qilish
Kerakli metodni o'rnatish
Delegatni chaqirish
Delegat quyida ko'rsatilgandek , delegate kalit so'zdan keyin funksiya imzosi yordamida e'lon qilinishi mumkin:
Quyida MyDelegate deb nomlangan delegat e'lon qilingan:
publicdelegatevoidMyDelegate(string msg);
Yuqorida biz void tipidagi va string parametrli MyDelegate delegatini e'lon qildik. Delegat sinfdan tashqarida yoki sinf ichida e'lon qilinishi mumkin. Quyidagi misolda sinfdan tashqarida e'lon qilamiz.
Delegat bir nechta metodlarni ko'rsatishi mumkin. Bir nechta metodni ko'rsatadigan delegat ko'p tarmoqli(Multicast) delegat deb ataladi. "+" yoki "+ =" operatori chaqiruvlar ro'yxatiga funksiyani qo'shadi va "-" yoki "-=" operatorlari uni o'chirib tashlaydi.
usingSystem;namespaceDelegate{publicdelegatevoidMyDelegate(string msg);classProgram {staticvoidMain(string[] args) {MyDelegate del1 =ClassA.MethodA;MyDelegate del2 =ClassB.MethodB;MyDelegate del = del1 + del2;del("Hello World");MyDelegate del3 = (string msg) =>Console.WriteLine("Lambda ifoda ishlatilishi: "+ msg); del += del3;del("Hello World"); del = del - del2;del("Hello World"); del -= del1;del("Hello World");Console.ReadKey(); } }classClassA {publicstaticvoidMethodA(string message) {Console.WriteLine("ClassA.MethodA() metodi chaqirildi: "+ message); } }classClassB {publicstaticvoidMethodB(string message) {Console.WriteLine("ClassB.MethodB() metodi chaqirildi: "+ message); } }}
Natija:
Agar delegat qiymatni qaytaradigan bo'lsa, unda ko'p sonli delegat chaqirilganda oxirgi tayinlangan maqsad metodining qiymati qaytariladi.
Umumiy delegatni delegat bilan bir xil tarzda aniqlash mumkin, lekin umumiy turdagi parametrlardan yoki qaytish turidan foydalangan holda. Maqsadli metodni o'rnatganingizda umumiy tur ko'rsatilishi kerak.
Masalan, int va string parametrlari uchun ishlatiladigan quyidagi umumiy delegatni ko'rib chiqamiz: