假设有一个静态扩展函数可将结果缓存如下:
public static Func<T, R> Memoize<T, R>(this Func<T, R> func)
{
var cache = new Dictionary<T, R>();
R result = default(R);
return x => cache.TryGetValue(x, out result) ? result : cache[x] = func(x);
}
如果在main方法中我声明了
Func<int, int> func1;
func1 = (x) => x + 1; // one method with <int, int>
func1 = func1.Memoize();
Func<int, long> func2;
func2 = (x) => x - 1; // other method with <int, long>
func2 = func2.Memoize();
它们会正常工作。但是,如果我声明两个委托都具有相同的类型签名怎么办?如果被调用,他们会破坏彼此的结果吗?
答案 0 :(得分:1)
我不确定您为什么认为类型签名会对您的Memoize
函数产生任何影响。 Memoize
的每次调用都会实例化其自己的字典。因此,func1
和func2
会彼此独立运行,而与所涉及的类型无关。
为进一步说明,从Memoize
返回的函数将字典捕获在闭包中,因此引用了在第一行创建的实例。由于您两次致电Memoize
,所以有两个单独的词典在播放。