FunctionPointer匿名函数的唯一性

时间:2012-11-14 02:19:06

标签: c# .net anonymous-function

我可以确定.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;
}

1 个答案:

答案 0 :(得分:2)

我认为你的意思是匿名代表。不同的代表有不同的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值也会更改。请注意这一点。