lazy ejemplos c# .net-4.0 lazy-initialization

c# - ejemplos - ¿Usar Lazy<T> es malo para el rendimiento?



lazy c# ejemplos (4)

Creo que puedes estar usando Lazy para su uso no previsto. Lazy se debe usar para situaciones en las que algo tiene un gran costo de inicialización, pero existe la posibilidad de que no se use durante la vida del objeto.

Si siempre llama a GroupDefaults al menos una vez durante su vida, un mejor método sería inicializar GroupDefaults en un hilo de fondo al inicio de la vida útil del contenedor y esperar que se GroupDefaults antes de que se inicie (sé que hay una clase para este pero necesito buscar en el MSDN para encontrarlo)

Recientemente estaba teniendo algunos problemas con una clase de singelton que era perezoso al inicializar un diccionario en el que un segundo subproceso intentaba usarlo antes de que realmente se hubiera rellenado. Así que implementé la inicialización de la variable a través de la clase Lazy<T> .

Aquí está mi código:

private static Dictionary<string, string> GroupDefaults { get { return mGroupDefaults.Value; } } private static Lazy<Dictionary<string, string>> mGroupDefaults = new Lazy<Dictionary<string,string>>(delegate { Dictionary<string, string> defaults = new Dictionary<string, string>(); foreach (KeyValuePair<string, UnitGroup> groupDef in Groups) defaults.Add(groupDef.Key, groupDef.Value.First().Key); return defaults; });

Esto solucionó el problema y ahora estoy considerando hacer de esto una práctica habitual para utilizar la clase Lazy<T> cualquier lugar en el que realice una inicialización lenta para evitar posibles problemas de enhebrado. Entonces, básicamente, me gustaría saber si esta es una buena / práctica común. ¿O será detremental para el rendimiento o algo así?


De la documentación, encuentro lo siguiente:

Si no se pasa ningún delegado en el constructor Lazy, el tipo ajustado se crea mediante el uso de Activator.CreateInstance cuando se accede por primera vez a la propiedad del valor. Si el tipo no tiene un constructor predeterminado, se lanza una excepción en tiempo de ejecución.

Activator.CreateInstance es un método notoriamente malo para el rendimiento. Sin embargo, eso no parece ser un problema en su caso, y en cualquier caso, como dijo dlev, invocar el método una vez no sería un problema. No he visto a Lazy<T> usado muy a menudo, pero no veo ninguna razón para no usarlo en su caso.


Es bastante difícil de decir sin saber qué tipo de restricciones de rendimiento tiene, pero en mi experiencia, la inicialización de una sola vez rara vez es un cuello de botella (ya que por definición solo ocurre una vez). Lazy<T> se escribió para proporcionarle esta exacta servicio, entonces recomendaría usarlo.


Si esto es para un singleton, un constructor estático puede ser lo que quieras. Algo como:

class MySingleton { static MySingleton() { Instance().InitDict(); } }