我有一个测试工作来在运行时优化lambda-expression。假设lambda包含一些“重”函数调用,我需要更改lambda,以便所有函数调用都缓存到临时变量中,然后可以替换lambda体中的实际函数调用。
它必须是一个将lambda作为参数的函数,并返回优化的lambda,然后你可以调用它。
我想知道C#的哪一部分呢?我的意思是,像“了解反思”或“了解仿制药”。在这种情况下我需要学习什么?
答案 0 :(得分:1)
除非您的重函数调用是deterministic,并且您可以证明它们始终使用相同的参数调用,否则您无法执行此操作。
例如,在C#
中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
如何判断Remove
是否具有确定性?你不能(技术上你可以拆卸它并检查它,但这是非常困难的)...然后你怎么能检测它是否被调用相同的参数?这是可行的,但非常困难。
现在......作为测试工作......我看到了三种可能性:
答案 1 :(得分:0)
我认为Memoization是您正在寻找的技术。
这篇文章解释了如何实现memoization in c# using generics and lambda expression。
最后,您可以在ReactiveUI MemoizingMRUCache中找到该技术的实际实现。