.net c#-4.0

.net - ¿Método de reinicialización perezoso?



c#-4.0 (5)

¿IsValueCreated no funciona para usted?

¿Alguien sabe por qué Microsoft no incluyó un método Clear () o una propiedad IsDirty o algo similar a la clase Lazy <T> en el .NET Framework 4.0? (Pregunta actualizada abajo)

Tenemos un tipo homebrew que hemos estado usando desde .NET 3.5, donde trabajo que hace lo mismo que la clase Lazy <T>, pero le permite a la instancia volver a evaluar el Lazy Func. Nos gustaría reemplazar nuestra clase con la nueva .NET pero este mecanismo Clear () o IsDirty no existe.

Permítanme reformular la pregunta original basada en los comentarios. ¿Hay alguna manera de reinicializar el método Lazy <T> Func sin reinstitiar la clase? Si no es así, ¿hay alguna forma de implementarlo como un método de extensión o es solo un mal patrón a seguir en primer lugar?


Lo que quieres hacer no es la inicialización perezosa, es otra cosa. Es por eso que no está en la clase Lazy<T> .


Porque es imposible hacerlo seguro para subprocesos. Las clases que garantizan que el programador disparará su pierna sin ninguna forma de solucionar el problema no pertenecen a un marco. Eres libre de disparar tu propia pierna.


Porque eso rompería la semántica del tipo. Si el estado de Lazy<T> deja de ser válido con el tiempo, debe considerar un tipo diferente.


Si realmente necesita restablecer su objeto Lazy <>, debe tener el mecanismo para crear una nueva instancia del tipo Lazy <>. Podría crear un contenedor que exponga las mismas propiedades que el tipo Lazy <> más el método de reinicio que simplemente lo recrea. En términos simples sería algo como:

public class ResettableLazy<T> { public T Value => this.Container.Value; public bool IsValueCreated => this.Container.IsValueCreated; public void Reset() { this.Container = new Lazy<T>(); } private Lazy<T> Container = new Lazy<T>(); }

La verdadera pregunta es si debes hacer algo así, pero si realmente lo necesitas, eso podría ser suficiente para tus necesidades.