Delegate void Message


Download 184.94 Kb.
bet3/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

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:
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