C#实现单参数函数转Lazy延迟版本的代码报错解决
错误点说明
你的代码存在两个直接导致运行失败、不符合预期的问题:
- 返回类型声明错误:方法体返回的是
x => ...格式的lambda表达式,本质是一个接收int参数的函数,和你声明的Lazy<int>返回类型完全不匹配 - 延迟逻辑完全失效:
new Lazy<int>(f1(x))会在构造Lazy实例的瞬间立刻执行f1(x)计算结果,根本没有延迟效果。Lazy构造函数需要传入无参的结果计算委托,只有当代码访问Lazy的Value属性时,才会触发这个委托执行计算,你直接传入f1的执行结果相当于提前完成了计算,违背了Lazy的设计目的。
正确实现
针对int入参、int返回的固定场景,修正后的代码如下:
public static Func<int, Lazy<int>> memo2(Func<int, int> f1) { return x => new Lazy<int>(() => f1(x)); }
调用示例:
// 转换得到延迟版本的函数 var lazyFunc = memo2(n => n * 2); // 传入参数拿到Lazy实例,此时传入的计算逻辑还未执行 var lazyResult = lazyFunc(99); // 第一次访问Value属性时,才会真正执行n*2的计算得到结果198 int result = lazyResult.Value;
如果需要适配任意类型的单参数函数,可以写泛型版本通用实现:
public static Func<TArg, Lazy<TReturn>> ToLazyFunc<TArg, TReturn>(Func<TArg, TReturn> sourceFunc) { return arg => new Lazy<TReturn>(() => sourceFunc(arg)); }
如果你需要实现记忆化效果(相同参数多次调用只执行一次计算、缓存结果),可以在方法内部加一个线程安全的字典存储对应参数的Lazy实例即可,基础延迟转换逻辑和上面一致。
内容的提问来源于stack exchange,提问作者Bartolinio Kooperinio
相关产品推荐
相关产品推荐

