Một lợi thế của biểu thức lambda là bạn phải đánh giá một hàm chỉ khi bạn cần kết quả của nó.C# biểu thức lambda và đánh giá lười biếng
Trong như sau (đơn giản) Ví dụ, chức năng Văn bản chỉ đánh giá khi một nhà văn có mặt:
public static void PrintLine(Func<string> text, TextWriter writer)
{
if (writer != null)
{
writer.WriteLine(text());
}
}
Thật không may, điều này làm cho sử dụng mã một chút xấu xí. Bạn không thể gọi nó với một hằng hoặc biến như
PrintLine("Some text", Console.Out);
và phải gọi nó theo cách này:
PrintLine(() => "Some text", Console.Out);
Trình biên dịch không có khả năng "suy ra" một hàm parameterless từ hằng trôi qua. Có kế hoạch để cải thiện điều này trong các phiên bản tương lai của C# hay tôi thiếu một cái gì đó?
UPDATE:
tôi chỉ tìm thấy một bẩn Hack bản thân mình:
public class F<T>
{
private readonly T value;
private readonly Func<T> func;
public F(T value) { this.value = value; }
public F(Func<T> func) {this.func = func; }
public static implicit operator F<T>(T value)
{
return new F<T>(value);
}
public static implicit operator F<T>(Func<T> func)
{
return new F<T>(func);
}
public T Eval()
{
return this.func != null ? this.func() : this.value;
}
}
Bây giờ tôi chỉ có thể xác định các chức năng như:
public static void PrintLine(F<string> text, TextWriter writer)
{
if (writer != null)
{
writer.WriteLine(text.Eval());
}
}
và gọi nó là cả với một chức năng hoặc một giá trị.
Tôi đồng ý. Trong trường hợp thêm quá tải, sẽ không thể nói sự khác biệt [nếu như một phím tắt được hỗ trợ]. – Krisc