Czy to zadziała jako Expression<Func<T>>
lub Func<T>
jako klucze w słowniku? Na przykład, aby buforować wynik ciężkich obliczeń.C#: Czy można używać wyrażeń lub funkcji jako klawiszy w słowniku?
Na przykład, zmieniając moje bardzo podstawowy cache z different question kopalni trochę:
public static class Cache<T>
{
// Alternatively using Expression<Func<T>> instead
private static Dictionary<Func<T>, T> cache;
static Cache()
{
cache = new Dictionary<Func<T>, T>();
}
public static T GetResult(Func<T> f)
{
if (cache.ContainsKey(f))
return cache[f];
return cache[f] = f();
}
}
Czy to jeszcze działa?
Edytuj: Po szybkim teście wygląda na to, że faktycznie działa. Ale odkryłem, że może to prawdopodobnie bardziej uniwersalne, ponieważ byłoby to teraz jeden cache od rodzaju powrotną ... nie wiem, jak zmienić go tak, by się nie stało, choć ... hmm
Edycja 2 : Noo, czekaj ... w rzeczywistości tak nie jest. Cóż, dla zwykłych metod to robi. Ale nie dla lambd. Otrzymują różne losowe nazwy metod, nawet jeśli wyglądają tak samo. Oh well c”)
Dlaczego to robisz? –
Nie jestem. Po prostu natknąłem się na tę myśl, gdy zastanawiałem się nad sprawami z pamięci podręcznej w moim drugim pytaniu i byłem ciekawy :) – Svish
Punkty bonusowe za ciekawość badawczą, ale nie widzę prawdziwego zastosowania tej techniki. Z drugiej strony pomysł ma wysoki współczynnik chłodzenia, gdyby zadziałał. –