Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在运行时优化lambda?_C#_Lambda - Fatal编程技术网

C# 如何在运行时优化lambda?

C# 如何在运行时优化lambda?,c#,lambda,C#,Lambda,我有一个在运行时优化lambda表达式的测试任务。假设lambda包含一些“重”函数调用,我需要的是更改lambda,以便将所有这些函数调用缓存到临时变量中,然后临时变量可以替换lambda主体中的实际函数调用 它必须是一个函数,该函数获取lambda作为参数,并返回优化的lambda,然后可以调用该lambda 我想知道这到底是C#的哪一部分?我的意思是,像“学习反思”或“学习泛型”。在这种情况下,我需要学习什么?除非您的重函数调用是,并且您可以证明它们总是使用相同的参数调用,否则您不能这样做

我有一个在运行时优化lambda表达式的测试任务。假设lambda包含一些“重”函数调用,我需要的是更改lambda,以便将所有这些函数调用缓存到临时变量中,然后临时变量可以替换lambda主体中的实际函数调用

它必须是一个函数,该函数获取lambda作为参数,并返回优化的lambda,然后可以调用该lambda


我想知道这到底是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