lazy ejemplos c# .net entity-framework c#-4.0 lazy-initialization

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