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()結果も異なりますが、最初に「異なるデリゲート」を定義する必要があります。2 つのデリゲートが同じメソッドを参照する場合、次のように同じと見なされます。

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ですが、キャッシュが期待どおりに機能しない可能性がありますgetDataCallbackアプリケーション プールがリサイクルされると、デリゲートが同じままでも FunctionPointer の値が変わります。これに注意してください。

于 2012-11-14T02:39:17.073 に答える