Tôi có đoạn mã sau:Ngăn chặn NET từ "nâng" biến địa phương
string prefix = "OLD:";
Func<string, string> prependAction = (x => prefix + x);
prefix = "NEW:";
Console.WriteLine(prependAction("brownie"));
Bởi vì trình biên dịch thay thế biến tiền tố với một kết thúc "MỚI: Brownie" được in ra cửa sổ Console.
Có cách nào dễ dàng để ngăn trình biên dịch nâng biến tiền tố trong khi vẫn sử dụng biểu thức lambda? Tôi muốn một cách làm cho công việc Func của tôi giống hệt:
Func<string, string> prependAction = (x => "OLD:" + x);
Lý do tôi cần điều này là tôi muốn sắp xếp hàng loạt đại biểu kết quả. Nếu biến tiền tố nằm trong một lớp không tuần tự hóa thì hàm trên sẽ không tuần tự hóa.
Cách duy nhất xung quanh này, tôi có thể nhìn thấy vào lúc này là tạo ra một lớp serializable mới mà các cửa hàng chuỗi như là một biến thành viên và có phương pháp chuỗi thêm vào trước:
string prefix = "NEW:";
var prepender = new Prepender {Prefix = prefix};
Func<string, string> prependAction = prepender.Prepend;
prefix = "OLD:";
Console.WriteLine(prependAction("brownie"));
Với lớp helper:
[Serializable]
public class Prepender
{
public string Prefix { get; set; }
public string Prepend(string str)
{
return Prefix + str;
}
}
Điều này có vẻ như rất nhiều công việc bổ sung để làm cho trình biên dịch bị "câm".
Vì vậy, câu hỏi của bạn không phải là về đánh giá lười biếng, nhưng về việc tuần tự hóa? – Sam