Biểu thức lambda C # có thể bao gồm nhiều hơn một câu không?
(Chỉnh sửa: Như được tham chiếu trong một số câu trả lời dưới đây, câu hỏi này ban đầu được hỏi về "dòng" thay vì "câu lệnh".)
Biểu thức lambda C # có thể bao gồm nhiều hơn một câu không?
(Chỉnh sửa: Như được tham chiếu trong một số câu trả lời dưới đây, câu hỏi này ban đầu được hỏi về "dòng" thay vì "câu lệnh".)
Câu trả lời:
(Tôi cho rằng bạn thực sự đang nói về nhiều câu lệnh hơn là nhiều dòng.)
Bạn có thể sử dụng nhiều câu lệnh trong biểu thức lambda bằng cách sử dụng dấu ngoặc nhọn, nhưng chỉ có thể chuyển đổi cú pháp không sử dụng dấu ngoặc nhọn thành cây biểu thức:
// 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; };
Bạn có thể đặt bao nhiêu dòng mới như bạn muốn trong một biểu thức lambda; C # bỏ qua các dòng mới.
Bạn có thể có nghĩa là để hỏi về nhiều câu .
Nhiều câu lệnh có thể được bọc trong dấu ngoặc nhọn.
Xem tài liệu .
Kể từ C # 7:
Tuyên bố dòng đơn:
int expr(int x, int y) => x + y + 1;
Tuyên bố đa dòng:
int expr(int x, int y) { int z = 8; return x + y + z + 1; };
Mặc dù chúng được gọi là các hàm cục bộ nhưng tôi nghĩ rằng cái này trông sạch hơn một chút so với các hàm sau và thực sự giống nhau
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;
}
Từ Lambda Expressions (Hướng dẫn lập trình C #) :
Phần thân của câu lệnh lambda có thể bao gồm bất kỳ số lượng câu lệnh nào; tuy nhiên, trong thực tế thường không quá hai hoặc ba.
Với c # 7.0 Bạn cũng có thể sử dụng như thế này
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);
}
}
Giả sử bạn có một lớp học:
public class Point
{
public int X { get; set; }
public int Y { get; set; }
}
Với C # 7.0 bên trong lớp này, bạn có thể làm điều đó ngay cả khi không có dấu ngoặc nhọn:
Action<int, int> action = (x, y) => (_, _) = (X += x, Y += y);
và
Action<int, int> action = (x, y) => _ = (X += x, Y += y);
sẽ giống như:
Action<int, int> action = (x, y) => { X += x; Y += y; };
Điều này cũng có thể hữu ích nếu bạn cần viết một phương thức hoặc hàm tạo thông thường trong một dòng hoặc khi bạn cần nhiều hơn thì một câu lệnh / biểu thức sẽ được đóng gói thành một biểu thức:
public void Action(int x, int y) => (_, _) = (X += x, Y += y);
hoặc là
public void Action(int x, int y) => _ = (X += x, Y += y);
hoặc là
public void Action(int x, int y) => (X, Y) = (X + x, Y + y);
Thông tin thêm về giải cấu trúc của bộ dữ liệu trong tài liệu .