Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Pilih ekspresi lambda saat Anda ingin meneruskan operasi singkat ke metode lain dan operasi tersebut paling jelas jika diletakkan di samping pemanggilan yang menggunakannya. Aturan sebaris memperlihatkan kepada pembaca cara Anda memilih atau mengubah item; metode bernama memungkinkan mereka memahami tujuan operasi sebelum mereka memeriksa detailnya.
Tip
Artikel ini mengajarkan pilihan praktis bagi pengembang yang memahami method dan collection di C#. Untuk sintaks dan aturan lambda lengkap, lihat referensi ekspresi lambda.
Ekspresi lambda adalah fungsi yang tidak disebutkan namanya yang Anda tulis saat bagian lain dari kode memerlukan perilaku tertentu.
Lambda berikut menerima sesi dan mengembalikan apakah sesi memiliki kursi terbuka:
session => session.Registered < session.Capacity
Operator => memisahkan parameter di sebelah kiri dari isi di sebelah kanan. Baca sebagai "menuju ke."
Meneruskan logika ke metode
Banyak API .NET menerima delegate, yang merupakan jenis yang mewakili perilaku dengan daftar parameter tertentu dan jenis pengembalian. Lambda memungkinkan perilaku tersebut. Untuk pengenalan tentang tipe delegasi seperti Func dan Action, lihat Ekspresi Lambda, delegasi, dan peristiwa.
Contoh berikut berfungsi dengan sesi lokakarya.
WorkshopSession berisi judul, durasi, kapasitas, dan jumlah pendaftaran.
int maximumMinutes = 60;
var shortSessions = sessions
.Where(session => session.DurationMinutes <= maximumMinutes)
.OrderBy(session => session.Title);
foreach (WorkshopSession session in shortSessions)
{
Console.WriteLine(session.Title);
}
Lambda pertama memberi tahu Where sesi mana yang harus disimpan. Yang kedua menentukan kepada OrderBy nilai mana yang akan diurutkan. Metode menerima perilaku tanpa mengetahui detail kedua aturan tersebut.
Pilih bentuk parameter
Pilih bentuk parameter terpendek yang tetap jelas:
session => session.DurationMinutes <= 60
Untuk satu parameter, hilangkan tanda kurung saat pengkompilasi dapat menyimpulkan jenisnya. Gunakan tanda kurung kosong untuk menyatakan tidak ada parameter:
() => DateTime.Now
Gunakan tanda kurung untuk dua parameter atau lebih:
(left, right) => left + right
Biasanya, metode yang menerima lambda menyediakan informasi yang cukup untuk pengkompilasi untuk menyimpulkan jenis parameter. Tulis tipe eksplisit ketika inferensi membutuhkan bantuan atau ketika tipe meningkatkan kejelasan:
(WorkshopSession session) => session.Title
Referensi ekspresi lambda mencakup pengubah parameter, atribut, nilai default, dan bentuk khusus lainnya.
Pilih badan ekspresi atau pernyataan
Gunakan ekspresi lambda saat satu ekspresi menghitung hasilnya:
session => session.Registered < session.Capacity
Gunakan statement lambda saat operasi membutuhkan lebih dari satu pernyataan. Apit isi dengan kurung kurawal, dan sertakan return ketika lambda mengembalikan nilai:
var descriptions = sessions.Select(session =>
{
int seatsLeft = session.Capacity - session.Registered;
string availability = seatsLeft > 0 ? $"{seatsLeft} seats left" : "full";
return $"{session.Title}: {availability}";
});
Console.WriteLine(string.Join(Environment.NewLine, descriptions));
Buat pernyataan lambda tetap singkat. Ketika isi fungsi membutuhkan beberapa langkah atau logika yang sama muncul lebih dari sekali, beri nama deskriptif pada perilaku tersebut dengan fungsi lokal atau metode reguler.
Mengambil nilai dari scope di sekitarnya
Lambda dapat menggunakan variabel yang dideklarasikan dalam metode yang menaunginya. Penggunaan ini disebut capture. Dalam contoh pertama, lambda seleksi menangkap maximumMinutes:
int maximumMinutes = 60;
var shortSessions = sessions.Where(
session => session.DurationMinutes <= maximumMinutes);
Grup tangkapan membantu aturan singkat memanfaatkan konteks lokal. Lambda menangkap variabel itu sendiri, bukan salinan nilainya. Jika variabel berubah sebelum lambda berjalan, lambda akan melihat nilai saat ini.
Permudah identifikasi konteks yang diperlukan. Jika lambda tidak memerlukan state di sekitarnya, tambahkan static untuk mencegah capture variabel yang tidak disengaja dan membuat kemandirian itu terlihat oleh pembaca:
var openSessions = sessions.Where(
static session => session.Registered < session.Capacity);
Lambda statis dapat menggunakan parameternya, nilai yang dideklarasikan, konstanta, dan anggota statis. Ini tidak dapat menggunakan variabel lokal atau status instans dari kode di sekitarnya.
Pilih lambda, grup metode, atau fungsi lokal
Beberapa bentuk C# dapat menyediakan perilaku ke parameter delegasi:
- Gunakan ekspresi lambda untuk perilaku singkat yang mudah dibaca saat diletakkan di samping pemanggilan.
- Gunakan method group saat metode yang ada memiliki tanda tangan yang diperlukan dan namanya menjelaskan perilaku.
- Gunakan fungsi lokal saat anggota induk membutuhkan logika bernama yang dapat digunakan kembali, rekursi, atau isi yang terlalu besar untuk lambda inline.
- Gunakan metode biasa saat beberapa anggota membutuhkan perilaku tersebut.
method group adalah nama metode tanpa daftar argumennya. Pengkompilasi mengonversi metode pencocokan ke jenis delegasi yang diperlukan:
var openSessions = sessions.Where(HasOpenSeats);
foreach (WorkshopSession session in openSessions)
{
Console.WriteLine($"Open: {session.Title}");
}
static bool HasOpenSeats(WorkshopSession session) =>
session.Registered < session.Capacity;
Where(HasOpenSeats) mengomunikasikan aturan yang sama seperti Where(session => HasOpenSeats(session)) dengan kode yang lebih sedikit. Nama metode memberi tahu pembaca apa yang diuji aturan; perbandingan sebaris menunjukkan bagaimana aturan tersebut diuji. Pertahankan pembungkus lambda saat menambahkan argumen, menggabungkan operasi, atau membuat panggilan lebih jelas.
Untuk perbandingan lokal terperinci, lihat Fungsi lokal.