2011-02-04 7 views
16

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

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

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

+7

Las preguntas sobre "Por qué no" son solo estridencias. ¿Puedes reformular esto de una manera más constructiva? –

+0

Agregar un método de extensión ... –

+0

Supongo que porque se ve como un valor y otro valor no tiene el mismo valor. – Skurmedel

Respuesta

10

Porque es imposible hacerlo seguro para hilos. 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.

+2

La seguridad de subprocesos es una opción para la clase Lazy, y probablemente ni siquiera sea la predeterminada. Por lo tanto, esta respuesta no aplica mucho. – flq

+1

¿Por qué es * imposible * hacerlo seguro? ¿No es solo una actualización dentro de un bloque de bloqueo y algunos bloqueos adicionales en las dos propiedades ('IsValueCreated' y' Value')? No soy un experto en multi-threading, pero parece factible a primera vista ... – user2173353

1

¿IsValueCreated no funciona para usted?

+1

IsValueCreated es de solo lectura ... lo sería si la propiedad tuviera un setter y causara que la reinicialización ocurriera en el siguiente uso. –

6

Lo que quieres hacer no es la inicialización Lazy, es algo más. Es por eso que no está en la clase Lazy<T>.

4

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.

2

Si realmente necesita restablecer su objeto <> Lazy necesita tener el mecanismo para hacer una nueva instancia de Lazy <> escriba. Puede crear un contenedor que exhiba las mismas propiedades que Lazy <> type plus Reset-method que simplemente lo recrea. En términos simples, sería algo así 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 cuestión es que debe hacer algo por el estilo, pero si realmente necesita que podría ser suficiente para sus necesidades.