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());
}
}