.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.