静态泛型函数可以互相干扰吗(C#)?

时间:2019-01-01 15:17:20

标签: c# static

假设有一个静态扩展函数可将结果缓存如下:

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();

它们会正常工作。但是,如果我声明两个委托都具有相同的类型签名怎么办?如果被调用,他们会破坏彼此的结果吗?

1 个答案:

答案 0 :(得分:1)

我不确定您为什么认为类型签名会对您的Memoize函数产生任何影响。 Memoize的每次调用都会实例化其自己的字典。因此,func1func2会彼此独立运行,而与所涉及的类型无关。

为进一步说明,从Memoize返回的函数将字典捕获在闭包中,因此引用了在第一行创建的实例。由于您两次致电Memoize,所以有两个单独的词典在播放。