c# - tipo - programacion generica java
Clase genérica estática como diccionario (4)
Creo que la versión genérica (primera) haría la búsqueda del diccionario en tiempo de compilación y, por lo tanto, se desempeñaría mejor en tiempo de ejecución.
Sin embargo, podría utilizar más memoria.
Un campo estático en una clase genérica tendrá un valor separado para cada combinación de parámetros genéricos. Por lo tanto, se puede utilizar como un Diccionario <Tipo, lo que sea >
¿Es esto mejor o peor que un Diccionario estático <Tipo, lo que sea >?
En otras palabras, ¿cuál de estas implementaciones es más eficiente?
public static class MethodGen<TParam> {
public static readonly Action<TParam> Method = CreateMethod();
static Action<TParam> CreateMethod() { /*...*/ }
}
O,
public static class MethodGen {
static readonly Dictionary<Type, Delegate> methods
= new Dictionary<Type, Delegate>();
public static Action<T> GetMethod<T>() {
//In production code, this would ReaderWriterLock
Delegate method;
if(!methods.TryGetValue(typeof(T), out method)
methods.Add(typeof(t), method = CreateMethod<T>());
return method;
}
static Action<T> CreateMethod<T>() { /*...*/ }
}
En particular, ¿cómo busca el CLR los campos estáticos por parámetro de tipo genérico?
Me gusta usar tipos genéricos de esta manera. En particular, a menudo tengo clases genéricas anidadas privadas precisamente para este propósito.
Lo que más me gusta de esto es que es difícil no obtener la inicialización de esta manera (en términos de seguridad de subprocesos), dada la forma en que funciona la inicialización de tipos. El único problema es qué hacer si falla la inicialización: ocasionalmente he recurrido a recordar una excepción para lanzar el primer acceso necesario, pero eso es bastante raro.
No me gustaría adivinar exactamente cómo el CLR busca el tipo a través de los argumentos de tipo, pero estoy bastante seguro de que estará optimizado para diablos y de vuelta :)
No almacena los valores para cada parámetro de tipo genérico tanto como realmente crea (conceptualmente de todos modos) N clases distintas, una para cada tipo T con el que lo use.
No lo he perfilado (que es la única forma de responder realmente a esta pregunta, la diferencia en el rendimiento puede ser tan pequeña como para que no tenga sentido), pero me atrevería a suponer que el bloqueo es lo más costoso. El CLR hace el bloqueo por usted, ¡y lo hace de una manera definida por expertos en este campo! - así que espero que si hay una diferencia, estaría a favor de usar la función de idioma en lugar de compilarla con el bloqueo del Dictionary
.