2012-11-14 34 views
1

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

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

请解释你为什么想知道。 – Dai

+0

你也可以说这是哪个API。显然,工作代码不会以“。”开头。 –

回答

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

所以回答你的第一个问题是YES,但您的缓存可能无法按预期工作!如果您的应用程序池被回收,则FunctionPointer值将更改,即使您的代理保持不变。注意这一点。

+0

当我的缓存可能无法使用时,您能否提供更多信息? – Evgraf

+0

@Evgraf:编写一个简单的控制台应用程序,并运行两次,您将为同一个代理获取不同的函数指针值。这与应用程序池回收时的情况相同。 –