(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:
// ValidFunc<int,int> a = x => x +1;Func<int,int> b = x =>{return x +1;};Expression<Func<int,int>> c = x => x +1;// InvalidExpression<Func<int,int>> d = x =>{return x +1;};
Saya mencoba memahami mengapa Func memungkinkan kawat gigi dan Ekspresi tidak memungkinkan. Pokoknya Ekspresi akan dipenuhi sebagai Func, Apakah ada cara untuk menambahkan beberapa logika baris ke Pohon Ekspresi? Jika tidak, mengapa ada pembatasan itu?
Habeeb
8
@Habeeb: "Pokoknya Ekspresi akan memenuhi fungsi" Tidak selalu. Banyak waktu yang tidak pernah dikompilasi untuk delegasi sama sekali - hanya diperiksa sebagai data. Pohon ekspresi di NET 4.0 melakukan memperoleh kemampuan untuk menyertakan beberapa pernyataan melalui Expression.Block tapi C # bahasa tidak mendukung itu. Itu bisa, tetapi itu akan membutuhkan lebih banyak desain / implementasi / pekerjaan uji.
Jon Skeet
26
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.
Bukankah lebih tepat mengatakan C # memperlakukan semua spasi putih, termasuk baris baru, secara merata? Kedengarannya agak menyesatkan untuk mengatakan itu mengabaikan baris baru - itu membuatnya tampak seperti menghapusnya sepenuhnya, dan Anda dapat membagi kata kunci di baris baru atau sesuatu.
Tesserex
6
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;};
Polity menunjukkan format multi-garis yang diminta oleh pertanyaan, bukan menghibur saran golf. Untuk menerapkan kode bijak Anda akan membuatnya "bukan jawaban"!
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:
publicvoidAction(int x,int y)=>(_, _)=(X += x, Y += y);
atau
publicvoidAction(int x,int y)=> _ =(X += x, Y += y);
atau
publicvoidAction(int x,int y)=>(X, Y)=(X + x, Y + y);
Jawaban:
Tentu:
sumber
(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:
sumber
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 .
sumber
Sejak C # 7:
Pernyataan garis tunggal:
Pernyataan multiline:
walaupun ini disebut fungsi lokal saya pikir ini terlihat sedikit lebih bersih daripada yang berikut dan secara efektif sama
sumber
sumber
Dari Ekspresi Lambda (Panduan Pemrograman C #) :
sumber
Dengan c # 7.0 Anda dapat menggunakan seperti ini juga
sumber
Katakanlah Anda memiliki kelas:
Dengan C # 7.0 di dalam kelas ini Anda dapat melakukannya bahkan tanpa tanda kurung:
dan
akan sama dengan:
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:
atau
atau
Lebih lanjut tentang dekonstruksi tupel dalam dokumentasi .
sumber