C# 如何在运行时优化lambda?
我有一个在运行时优化lambda表达式的测试任务。假设lambda包含一些“重”函数调用,我需要的是更改lambda,以便将所有这些函数调用缓存到临时变量中,然后临时变量可以替换lambda主体中的实际函数调用 它必须是一个函数,该函数获取lambda作为参数,并返回优化的lambda,然后可以调用该lambdaC# 如何在运行时优化lambda?,c#,lambda,C#,Lambda,我有一个在运行时优化lambda表达式的测试任务。假设lambda包含一些“重”函数调用,我需要的是更改lambda,以便将所有这些函数调用缓存到临时变量中,然后临时变量可以替换lambda主体中的实际函数调用 它必须是一个函数,该函数获取lambda作为参数,并返回优化的lambda,然后可以调用该lambda 我想知道这到底是C#的哪一部分?我的意思是,像“学习反思”或“学习泛型”。在这种情况下,我需要学习什么?除非您的重函数调用是,并且您可以证明它们总是使用相同的参数调用,否则您不能这样做
我想知道这到底是C#的哪一部分?我的意思是,像“学习反思”或“学习泛型”。在这种情况下,我需要学习什么?除非您的重函数调用是,并且您可以证明它们总是使用相同的参数调用,否则您不能这样做 例如,在C中#
var lst=新列表{“Foo”,“Bar”};
boolr1=lst.Remove(“Foo”);//正确,并且修改了lst
boolr2=lst.Remove(“Foo”);//错误,并且没有修改lst
bool r3=lst.移除(“条”);//为true,并且已修改lst,请注意不同的参数
bool r4=第一次移除(“Baz”);//false,未修改lst,请注意不同的参数
如何检测Remove
是否具有确定性?你不能(从技术上来说,你可以拆卸它并检查它,但这是非常困难的)。。。然后,您如何检测是否使用相同的参数调用它?这是可行的,但相当困难
现在。。。作为一项测试工作。。。我认为有三种可能性:
- 这是一个错误的测试,你必须理解并报告它
- 你不理解测试工作
- 您没有给我们提供一些重要信息(例如,您必须替换一些没有参数的特定方法调用,这些方法调用是静态的或类似的,并且保证是确定性的)
最后,你可以在.< /P>@ YaelelSiko中找到一个技术的实际实现,你如何检查x y是不变的并且在中间不改变吗?@ XANATOS-当假设f是确定的时,你所需要的是x和y的起始值。@ HenkHolterman?不,函数是基于参数确定的。。如果更改参数,结果将更改。确定性算法是一种算法,给定一个特定的输入,它将始终产生相同的输出(来自wiki)。。。例子。。。加(1,2)=3,加(1,3)=5,加(1,2)=3,加(1,2)==3,加(1,2)==3。。。Add是确定性的,但如果它更改参数,结果更改对于引用类型来说会变得更加复杂<代码>int c1=可枚举的计数(myList);添加(1);int c2=可枚举的计数(myList)代码>。现在<代码>可枚举。计数是确定的,
myList
是相同的(与同一引用中的相同)。。。但是myList
在两行之间发生了更改。是的。“…您需要x和y的[起始]值”。还有什么不清楚的?表达式树是C#books中的一章。它与反射(至少需要知道一点)是半关联的。它只与泛型相关(因为您可能需要对泛型方法进行反射:-),并且表达式。Lambda
使用泛型。。。因此,它更多地与字符串或数组相关联,而不是与泛型相关联)您可以查找,这似乎是这里的问题。lamdba表达式不是全部由运行时编译的吗?@Ewan Lambda表达式有两个方面:Func f=x=>x+1
是由编译器编译的,而Expression f=x=>x+1
不是。第二个是“表达式树”,可以在运行时进行解析/分析/修改(然后进行编译)(如果我们想更准确地说,它不能被修改……但创建一个副本并进行一些更改几乎很容易)在知道模式名称和为其编写表达式树重写器之间,距离相当大。
var lst = new List<string> { "Foo", "Bar" };
bool r1 = lst.Remove("Foo"); // true, and has modified lst
bool r2 = lst.Remove("Foo"); // false, and hasn't modified lst
bool r3 = lst.Remove("Bar"); // true, and has modified lst, note different parameter
bool r4 = lst.Remove("Baz"); // false, and hasn't modified lst, note different parameter