c# - ejemplos - ¿Cómo usar System.Lazy con Setter para la inicialización lenta de la lista en las entidades de POCO?
lazy initialization c# (3)
Quiero usar System.Lazy to Lazy Initialization of my List en mis Entites:
public class Questionary
{
private Lazy<List<Question>> _questions = new Lazy<List<Question>>(() => new List<Question>());
public IList<Question> Questions { get { return _questions.Value; } set { _questions.Value = value; } }
}
El problema está en mi SETTER, recibe este error: la propiedad '' System.Lazy<T>.Value
'' no tiene setter
Si quiero hacer MyInstance.Questions = new List<Question> { ... }
?
¿Cómo procedo?
Actualizar:
Estoy tratando de evitar eso:
private IList<Question> _questions;
//Trying to avoid that ugly if in my getter:
public IList<Question> Questions { get { return _questions == null ? new List<Question>() : _questions; } set { _questions = value } }
¿Estoy haciendo algo mal?
No está claro lo que estás tratando de hacer. No puede establecer el valor de un Lazy<T>
; es tan simple como eso. Solo puede pedirle un valor, y ejecutará el delegado que ha proporcionado la primera vez que se solicitan los valores.
¿Realmente necesitas un setter en tu clase? Quizás solo quieras:
public class Questionary
{
private Lazy<List<Question>> _questions =
new Lazy<List<Question>>(() => new List<Question>());
public IList<Question> Questions { get { return _questions.Value; } }
}
Podrías hacer algo como esto:
public class Questionary
{
private Lazy<IList<Question>> _questions =
new Lazy<IList<Question>>(() => new List<Question>());
public IList<Question> Questions
{
get { return _questions.Value; }
set { _questions = new Lazy<IList<Question>>(() => value); }
}
}
Sin embargo, no veo por qué necesita Lazy<T>
aquí en absoluto. No hay ningún beneficio en usarlo, porque la inicialización de una nueva List<T>
debería ser la misma que la inicialización de un nuevo Lazy<T>
...
Creo que sería suficiente mantenerlo tan simple como esto:
public class Questionary
{
private IList<Question> _questions = new List<Question>();
public IList<Question> Questions
{
get { return _questions; }
set { _questions = value; }
}
}
o
public class Questionary
{
public Questionary()
{
Questions = new List<Question>();
}
public IList<Question> Questions { get; set; }
}
Solución no perezosa: el mismo beneficio en términos de inicialización solo cuando se llama:
private List<Question> _questions;
public List<Question> Questions { get { return _questions ?? (_questions = new List<Question>()); } set { _questions = value; } }