videos que puedes poner película how hashtags google como adulto c# .net-4.0 lazy-initialization

c# - que - youtube google



¿Por qué Lazy<T> está restringido a contextos estáticos? (3)

Me gustaría utilizar Lazy T para implementar la memoria, pero parece que la función de inicialización requiere un contexto estático.

Por ejemplo, el siguiente código se niega a compilar, advirtiendo que los miembros no estáticos a y b son inaccesibles. No tengo claro por qué esto es así, ya que el objeto Lazy es un miembro de instancia en sí mismo y no tiene visibilidad en un contexto estático.

public class SomeExpensiveCalculation { private int a; private int b; public Lazy<int> Result = new Lazy<int>(() => a + b); //nope! }


Los inicializadores de objetos fuera de un constructor (o método) tienen que referirse solo a miembros estáticos. Esto se debe a que la instancia no se ha construido hasta que se ejecuta el constructor, por lo tanto, los campos no están "listos todavía" y por lo tanto no se pueden referenciar. Los campos estáticos funcionan porque se inicializan antes de los campos.

Tenga en cuenta que el error no es causado por Lazy<T> , sino por la expresión lambda. La solución (y la forma correcta de hacerlo) es inicializar Result en un constructor.


No sé por qué tu código no funciona, pero debería funcionar:

public class SomeExpensiveCalculation { private int a; private int b; public Lazy<int> Result; public SomeExpensiveCalculation() { Result = new Lazy<int>(() => a + b); } }


Solo para ampliar la respuesta de @Ondra, esto también se puede usar con una fábrica inyectada. Una advertencia: tenga cuidado con la vida útil relativa de los perezosos y la fábrica:

public class SomeClass { private readonly Lazy<ISomeDependency> _lazyField; // Ctor public SomeClass(ISomeFactory factory) { _lazyField = new Lazy<ISomeDependency>(() => factory.Create()); } }