Delegate void Message
Download 184.94 Kb.
|
Amaliyot ishi Dasturlash texnologiyalari
Lyambda – ifodalar.
Lambda ifodalari anonim usullarning soddalashtirilgan ifodasidir. Lambda iboralari qiymatni qaytarishi mumkin bo'lgan va boshqa usullarga parametr sifatida o'tkazilishi mumkin bo'lgan qisqa, ixcham usullarni yaratishga imkon beradi. Lambda iboralari quyidagi sintaksisga ega: lambda operatorining chap tomonida => parametrlar roʻyxati aniqlangan, oʻng tomonda esa ushbu parametrlardan foydalangan holda ifodalar bloki joylashgan: (parameter_list) => ifoda Ma'lumotlar turi bo'yicha lambda ifodasi delegatni ifodalaydi. Masalan, oddiy lambda ifodasini aniqlaymiz: Message hello = () => Console.WriteLine("Hello"); hello(); // Hello hello(); // Hello hello(); // Hello delegate void Message(); Bunday holda, salom o'zgaruvchisi Xabar delegatini ifodalaydi - ya'ni hech narsa qaytarmaydigan va hech qanday parametr qabul qilmaydigan ba'zi harakatlar. Ushbu o'zgaruvchining qiymati sifatida lambda ifodasi tayinlangan. Ushbu lambda ifodasi Xabar delegatiga mos kelishi kerak - u ham parametrlarni olmaydi, shuning uchun lambda operatorining chap tomonida bo'sh qavslar mavjud. Lambda operatorining o'ng tomonida esa bajariladigan ifoda - Console.WriteLine("Salom") Keyin dastur ushbu o'zgaruvchini usul sifatida chaqirishi mumkin. Agar lambda ifodasi bir nechta amallarni o'z ichiga olsa, ular jingalak qavslarga joylashtiriladi: Message hello = () => { Console.Write("Hello "); Console.WriteLine("World"); }; hello(); // Hello World Yuqorida biz xabar delegatini ifodalovchi salom o'zgaruvchisini aniqladik. Ammo C# 10 dan boshlab, biz lambda ifodasini aniqlashda yashirin yozishdan (var ifodasi bilan o'zgaruvchini aniqlash) foydalanishimiz mumkin: var hello = () => Console.WriteLine("Hello"); hello(); // Hello hello(); // Hello hello(); // Hello Lekin bu holatda salom qaysi turni ifodalaydi? Yashirin terish bilan kompilyatorning o'zi ba'zi delegatlar bilan ta'rifiga asoslangan lambda ifodasini moslashtirishga harakat qiladi. Misol uchun, yuqorida tavsiflangan standart salom lambda ifodasi kompilyator tomonidan o'rnatilgan Action delegatining o'zgaruvchisi sifatida ko'rib chiqiladi, u parametrlarni olmaydi va hech narsani qaytarmaydi. Parametrlar ro'yxatini belgilashda biz ular uchun ma'lumotlar turini belgilamasligimiz mumkin: Operation sum = (x, y) => Console.WriteLine($"{x} + {y} = {x + y}"); sum(1, 2); // 1 + 2 = 3 sum(22, 14); // 22 + 14 = 36 delegate void Operation(int x, int y); Bunday holda, kompilyator lambda ifodasi yig'indisi Operation turini ifodalashini ko'radi, ya'ni ikkala lambda parametri ham int turini ifodalaydi. Shuning uchun hech qanday muammo tug'ilmaydi. Biroq, agar biz yashirin yozishdan foydalansak, kompilyator lambda ifodasi uchun delegat turini xulosa qilishda qiyinchiliklarga duch kelishi mumkin, masalan, quyidagi holatda var sum = (x, y) => Console.WriteLine($"{x} + {y} = {x + y}"); // ! Xatolik Bunday holda siz parametrlar turini belgilashingiz mumkin var sum = (int x, int y) => Console.WriteLine($"{x} + {y} = {x + y}"); sum(1, 2); // 1 + 2 = 3 sum(22, 14); // 22 + 14 = 36 Agar lambda ma'lumotlar turini talab qilmaydigan bitta parametrga ega bo'lsa, qavslar olib tashlanishi mumkin: PrintHandler print = message => Console.WriteLine(message); print("Hello"); // Hello print("Welcome"); // Welcome delegate void PrintHandler(string message); Lambda ifodasi natijani qaytarishi mumkin. Qaytish natijasi lambda operatoridan keyin ko'rsatilishi mumkin: var sum = (int x, int y) => x + y; int sumResult = sum(4, 5); // 9 Console.WriteLine(sumResult); // 9 Operation multiply = (x, y) => x * y; int multiplyResult = multiply(4, 5); // 20 Console.WriteLine(multiplyResult); // 20 delegate int Operation(int x, int y); Agar lambda ifodasi bir nechta iboralarni o'z ichiga olgan bo'lsa, odatdagi usullarda bo'lgani kabi, qaytarish iborasidan foydalanishingiz kerak: var subtract = (int x, int y) => { if (x > y) return x - y; else return y - x; }; int result1 = subtract(10, 6); // 4 Console.WriteLine(result1); // 4 int result2 = subtract(-10, 6); // 16 Console.WriteLine(result2); // 16 Lambda ifodasi delegatni ifodalaganligi sababli, xuddi delegat kabi, siz lambda ifodasini ifodalovchi o'zgaruvchiga usullar va boshqa lambdalarni qo'shishingiz mumkin: var hello = () => Console.WriteLine("METANIT.COM"); var message = () => Console.Write("Hello "); message += () => Console.WriteLine("World"); message += hello; message += Print; message(); Console.WriteLine("--------------"); message -= Print; message -= hello; message?.Invoke(); void Print() => Console.WriteLine("Welcome to C#"); Download 184.94 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling