Clase genérica estática como diccionario

Un campo estático en una clase genérica tendrá un valor separado para cada combinación de parámetros generics. Por lo tanto, se puede usar como un diccionario <tipo, lo que sea >

¿Es esto mejor o peor que un diccionario estático <Type, whatever >?

En otras palabras, ¿cuál de estas implementaciones es más eficiente?

public static class MethodGen { public static readonly Action Method = CreateMethod(); static Action CreateMethod() { /*...*/ } } 

O,

 public static class MethodGen { static readonly Dictionary methods = new Dictionary(); public static Action GetMethod() { //In production code, this would ReaderWriterLock Delegate method; if(!methods.TryGetValue(typeof(T), out method) methods.Add(typeof(t), method = CreateMethod()); return method; } static Action CreateMethod() { /*...*/ } } 

En particular, ¿cómo busca el CLR los campos estáticos por parámetro de tipo genérico?

Me gusta usar tipos generics de esta manera. En particular, a menudo tengo clases genéricas privadas anidadas precisamente para este propósito.

Lo principal que me gusta 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 será optimizado para que lo respalden 🙂

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 que no tiene sentido) pero me atrevería a adivinar que el locking es la parte cara. ¡El CLR hace el locking por usted, y lo hace de una manera definida por expertos en este campo! – por lo que espero que si hay una diferencia, sea a favor de utilizar la función de idioma en lugar de comstackrla tú mismo con Dictionary + locking.

No almacena 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 la utilice.

Creo que la versión genérica (primera) haría la búsqueda del diccionario en tiempo de comstackción y, por lo tanto, funcionaría mejor en tiempo de ejecución.

Sin embargo, podría usar más memoria.