使用 Expression<Func<T>>
会有效吗?或 Func<T>
作为字典中的键?例如缓存大量计算的结果。
例如,将我的非常基本的缓存从 different question 更改为我的一点:
public static class Cache<T>
{
// Alternatively using Expression<Func<T>> instead
private static Dictionary<Func<T>, T> cache;
static Cache()
{
cache = new Dictionary<Func<T>, T>();
}
public static T GetResult(Func<T> f)
{
if (cache.ContainsKey(f))
return cache[f];
return cache[f] = f();
}
}
这还能行吗?
编辑: 经过快速测试,它似乎确实有效。但我发现它可能更通用,因为它现在是每个返回类型一个缓存...不知道如何更改它以防止这种情况发生...嗯
编辑 2: 不,等等……它实际上没有。好吧,对于常规方法它确实如此。但不适用于 lambda。即使它们看起来相同,它们也会获得各种随机方法名称。哦好吧 c",)
最佳答案
您可以使用任何类型的对象,只要它是实例即可。即使是代表,但我不建议使用代表作为键,因为它们不是为此而设计的。我不确定独立创建的委托(delegate)是否会产生相同的哈希码,如果它们可以进行比较(相等)则更少。
关于C#:是否可以使用表达式或函数作为字典中的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1131556/