2012-11-14 32 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:編寫一個簡單的控制檯應用程序,並運行兩次,您將爲同一個代理獲取不同的函數指針值。這與應用程序池回收時的情況相同。 –