Bisakah ekspresi C # lambda menyertakan lebih dari satu pernyataan?
(Sunting: Seperti yang dirujuk dalam beberapa jawaban di bawah, pertanyaan ini awalnya bertanya tentang "baris" dan bukan "pernyataan".)
Bisakah ekspresi C # lambda menyertakan lebih dari satu pernyataan?
(Sunting: Seperti yang dirujuk dalam beberapa jawaban di bawah, pertanyaan ini awalnya bertanya tentang "baris" dan bukan "pernyataan".)
Jawaban:
(Saya berasumsi Anda benar-benar berbicara tentang banyak pernyataan daripada beberapa baris.)
Anda bisa menggunakan banyak pernyataan dalam ekspresi lambda menggunakan tanda kurung, tetapi hanya sintaks yang tidak menggunakan tanda kurung yang dapat dikonversi menjadi pohon ekspresi:
// Valid
Func<int, int> a = x => x + 1;
Func<int, int> b = x => { return x + 1; };
Expression<Func<int, int>> c = x => x + 1;
// Invalid
Expression<Func<int, int>> d = x => { return x + 1; };
Anda dapat menempatkan baris baru sebanyak yang Anda inginkan dalam ekspresi lambda; C # mengabaikan baris baru.
Anda mungkin bermaksud bertanya tentang banyak pernyataan .
Berbagai pernyataan dapat dibungkus dengan kawat gigi.
Lihat dokumentasi .
Sejak C # 7:
Pernyataan garis tunggal:
int expr(int x, int y) => x + y + 1;
Pernyataan multiline:
int expr(int x, int y) { int z = 8; return x + y + z + 1; };
walaupun ini disebut fungsi lokal saya pikir ini terlihat sedikit lebih bersih daripada yang berikut dan secara efektif sama
Func<int, int, int> a = (x, y) => x + y + 1;
Func<int, int, int> b = (x, y) => { int z = 8; return x + y + z + 1; };
Func<string, bool> test = (name) =>
{
if (name == "yes") return true;
else return false;
}
Dari Ekspresi Lambda (Panduan Pemrograman C #) :
Badan pernyataan lambda dapat terdiri dari sejumlah pernyataan; Namun, dalam praktiknya biasanya tidak lebih dari dua atau tiga.
Dengan c # 7.0 Anda dapat menggunakan seperti ini juga
Public string ParentMethod(int i, int x){
int calculation = (i*x);
(string info, int result) InternalTuppleMethod(param1, param2)
{
var sum = (calculation + 5);
return ("The calculation is", sum);
}
}
Katakanlah Anda memiliki kelas:
public class Point
{
public int X { get; set; }
public int Y { get; set; }
}
Dengan C # 7.0 di dalam kelas ini Anda dapat melakukannya bahkan tanpa tanda kurung:
Action<int, int> action = (x, y) => (_, _) = (X += x, Y += y);
dan
Action<int, int> action = (x, y) => _ = (X += x, Y += y);
akan sama dengan:
Action<int, int> action = (x, y) => { X += x; Y += y; };
Ini juga mungkin berguna jika Anda perlu menulis metode atau konstruktor reguler dalam satu baris atau ketika Anda membutuhkan lebih dari satu pernyataan / ekspresi untuk dikemas dalam satu ekspresi:
public void Action(int x, int y) => (_, _) = (X += x, Y += y);
atau
public void Action(int x, int y) => _ = (X += x, Y += y);
atau
public void Action(int x, int y) => (X, Y) = (X + x, Y + y);
Lebih lanjut tentang dekonstruksi tupel dalam dokumentasi .