prefix + x); prefix = "NEW:"; Console.Wri-6ren">
gpt4 book ai didi

c# - 阻止 .NET 使用 "lifting"局部变量

转载 作者:太空狗 更新时间:2023-10-29 20:19:09 25 4
gpt4 key购买 nike

我有以下代码:

string prefix = "OLD:";
Func<string, string> prependAction = (x => prefix + x);
prefix = "NEW:";
Console.WriteLine(prependAction("brownie"));

因为编译器用闭包替换了前缀变量,“NEW:brownie”被打印到控制台。

有没有一种简单的方法可以防止编译器在提升前缀变量的同时仍然使用 lambda 表达式?我想要一种使我的 Func 以相同方式工作的方法:

Func<string, string> prependAction = (x => "OLD:" + x);

我需要这个的原因是我想序列化生成的委托(delegate)。如果前缀变量在不可序列化的类中,则上述函数将不会序列化。

目前我能看到的解决这个问题的唯一方法是创建一个新的可序列化类,将字符串存储为成员变量并具有字符串前置方法:

string prefix = "NEW:";
var prepender = new Prepender {Prefix = prefix};
Func<string, string> prependAction = prepender.Prepend;
prefix = "OLD:";
Console.WriteLine(prependAction("brownie"));

辅助类:

[Serializable]
public class Prepender
{
public string Prefix { get; set; }
public string Prepend(string str)
{
return Prefix + str;
}
}

为了让编译器变得“愚蠢”,这似乎需要做很多额外的工作。

最佳答案

我现在看到了潜在的问题。它比我最初想象的要深。基本上解决方案是在序列化之前修改表达式树,通过用常量节点替换所有不依赖于参数的子树。这显然被称为“funcletization”。有它的解释here .

关于c# - 阻止 .NET 使用 "lifting"局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/110536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com