Mam następujący kod:Prevent z .NET „podnoszenia” zmiennych lokalnych
string prefix = "OLD:";
Func<string, string> prependAction = (x => prefix + x);
prefix = "NEW:";
Console.WriteLine(prependAction("brownie"));
Ponieważ kompilator zastępuje zmienną prefiksu z zamknięciem „NEW: brownie” jest drukowany na konsoli.
Czy istnieje prosty sposób, aby uniemożliwić kompilatorowi podniesienie zmiennej prefiksu, nadal korzystając z wyrażenia lambda? Chciałbym sposób dokonywania moją pracę Func identycznie:
Func<string, string> prependAction = (x => "OLD:" + x);
Powodem muszę to chciałbym serializacji wynikowy delegata. Jeśli zmienna przedrostkowa znajduje się w klasie niezdolnej do serializacji, powyższa funkcja nie będzie serializować.
Jedynym sposobem wokół to widzę w tej chwili jest stworzenie nowej klasy można zaszeregować który przechowuje ciąg jako zmienną Członkowskim oraz ma metodę ciąg poprzedzić:
string prefix = "NEW:";
var prepender = new Prepender {Prefix = prefix};
Func<string, string> prependAction = prepender.Prepend;
prefix = "OLD:";
Console.WriteLine(prependAction("brownie"));
z klasą pomocnika:
[Serializable]
public class Prepender
{
public string Prefix { get; set; }
public string Prepend(string str)
{
return Prefix + str;
}
}
Wydaje się, że jest to bardzo dużo pracy, aby kompilator był "głupi".
Twoje pytanie nie dotyczy leniwej oceny, ale serializacji? – Sam