2

我可以确定.Method.MethodHandle.GetFunctionPointer()每个匿名函数都是唯一的吗?想做

public static T Get<T>(Func<T> getDataCallback) where T : class
{
    string cacheID = getDataCallback.Method.MethodHandle.GetFunctionPointer().ToString();
    var data = HttpRuntime.Cache.Get(cacheID) as T;
    if (data == null)
    {
        data = getDataCallback();
        HttpContext.Current.Cache.Insert(cacheID, data);
    }
    return data;
}
4

1 回答 1

3

我认为您的意思是匿名代表。不同的委托有不同的d.Method.MethodHandle.GetFunctonPointer()结果,但首先我们需要定义“不同的委托”。如果两个委托引用相同的方法,则它们被认为是相同的,例如:

Action a = new Action(MyMethod);
Action b = new Action(MyMethod);   
//a == b, that is, Delegate.Equals(a,b) is true

匿名代表总是不同的,即使他们看起来一样:

Action a = delegate { MyMethod(); }; 
Action b = delegate { MyMethod(); };

所以你的第一个问题的答案是肯定的,但你的缓存可能不会按预期工作!如果您的应用程序池被回收,即使您的getDataCallback委托保持不变,FunctionPointer 的值也会发生变化。请注意这一点。

于 2012-11-14T02:39:17.073 回答