|
Lambda-ifodasining kelib chiqishi
|
bet | 9/9 | Sana | 13.02.2024 | Hajmi | 1 Mb. | | #156042 |
Bog'liq 37-mavzuLyambda ifodalar
Bu delegatlar bilan ishlashda yozuvni qisqartirish usulidir. Quyidagi misol (13.6-listingni qaraymiz:
13.6-listing
using System;
namespace app63_lambda1
{
internal class Program
{
public delegate int Ar(int x);
public static int Add(int x)
{ return -x; }
private static void Main()
{
Console.WriteLine("Oddiy delegate va lyamda-ifoda misoli\n");
// Delegatning nusxasini yaratish
Ar b = new Ar(Add);
// Ar d = x => -x;
// Lyamda ifodani biz yozishimizmumkin bo’ladi, va demak, delegate orqali
Func d = x => -x; // Lyamda-ifoda
// Lyambda-ifoda va delegatdan foydalanish bilan Add() metodini chaqirish
Console.WriteLine("Delegat metodni chaqirish natijasi: {0}", b(2));
Console.WriteLine("L-ifodani metodini chaqirish natijasi: {0}", d(2));
Console.Read();
}
}
}
13.6-rasm. Lyamda-ifoda va delegatning ishlashini solishtirish
Rasmdan ko’rinib turibdiki, natija oddiy sintaksis hisoblangan lyambda-ifoda ko’rinishida yozilganda ham bir xil. Bu misolda oddiy anonim metod ko’rsatilgan bo’lib, u o’ziga xos usulda ifoda bilan yozilgan:
Func d = x => -x;
x => -x; - // bu yerda lyambda-ifodadir.
Bu “parametr sifatida x ni oladi va x ga quyidagi amallar natijasini qaytaradi” kabi o’qiladi. Amallar natijasi bu – (-x). Faktik jihatdan –x – bu anonim blokning operatorlaridan bittasidir. delegate kalit sozi o’rniga bu yerda Func qo’llanilgan (parametrlar ro’yxatini tiplashtirish tipi). Func<> - bu yangi yordamchi tip, qaytaruvchi natijani va to’rttagacha argumentni qabul qiladi. Undan oddiy delegatlar e’loni uchun foydalanishimiz mumkin va u System nomlar fazosida taqdim etiladi. Ushbu holatda d o’zgaruvchisi e’loni delegat bo’ladi, uning qabul qiluvci tipi int va qaytaruvchi tipi ham int bo’ladi. E’tibor bersak, lyambda-ifoda o’zgaruvchi haqidagi ma’lumotlardan mutlaqo foydalanmaydi. Kompilyator lyambda-ifodani d o’zgaruvchsiga ta’minlaganda, delegat uchun aniqlangan tiplar haqida ma’lumotlardan foydalanadi, ya’ni x ning qiymati int, uning qaytaruvchi qiymati ham int. Lyambda-ifodalarni biz delegatlar orqali to’g’ridan-to’g’ri yozishimiz mumkin bo’ladi:
Ar d = x => -x;
Yuqorida ko’rib chiqqan lyambda-ifodamizda bitta parametr mavjud(x). Lekin ularning soni bir qancha yoki umuman bo’lmasligi ham mumkin. Umuman olganda, lyambda-ifodaning ko’rinishi quyidagicha bo’ladi:
(kiruvchi_parametrlar) => ifoda
Agar lyambda-ifoda faqat bitta kiruvchi parametrga ega bo’lsa, qavslar qo’yilmaydi (buni misolimizda ko’rish mumkin), qolgan barcha holatlarda albatta qavslar bo’ladi. Ikki va undan ortiq parametrlar vergul bilan ajratiladi va oxirida qavs yopiladi. Masalan,
(x, y) => x == y
Ba’zida kompilyatorlar og’ir va hattoki, mumkin bo’lmagan kiruvchi tiplarni aniqlashi mumkin. Bu holatda tiplar quyidagi misolda ko’rsatilgani kabi oshkor ravishda korsatiladi:
(int x, string s) => s.Length > x
Kirish parametrlari mavjud bo’lmasa bo’sh qavslar orqali ko’rsatiladi:
() => SomeMethod()
Nazorat uchun savollar :
Lyamba haqida ma’lumot
Lyambdaga oid misollar
Delegat haqida ma’lumot
|
| |