.net - mvvmlightlibs - Limpieza vs Dispose(bool) en MVVM-light
mvvm light uwp (3)
Creo que debo discrepar un poco con Laurent en este punto. La idea detrás de IDisposable es que el objeto puede tener cierta limpieza que debe llevarse a cabo y no tiene nada que ver con la recolección de basura. De hecho, la mayor parte del tiempo IDisposable se implementa para limpiar recursos no administrados , como manejadores de archivos, objetos de sincronización o conexiones de bases de datos, que están fuera del alcance del GC. Además, el hecho de que una clase base implemente IDisposable no significa que deba tener una implementación real. Eso se puede relegar al método Dispose (bool disposing) virtual que puede ser anulado por las clases derivadas para que puedan realizar la limpieza.
El problema, como alude Budda, es que IDisposable es, por convención, una operación de un solo sentido. Una vez que un objeto ha sido eliminado, debe arrojar una ObjectDisposedException en sus métodos públicos. Si todo lo que quiere hacer es eliminar recursos para que pueda reutilizar el objeto, entonces tiene sentido un método de limpieza. Sin embargo, no eliminaría necesariamente la funcionalidad Dispose, que tiene un propósito diferente.
En la última versión de MVVM-light (V3 SP1) los métodos "Dispose ()" y "Dispose (bool)" en la clase ViewModel están marcados
No use más este método, se eliminará en una versión futura. Use ICleanup.Cleanup () en su lugar
¿Esto significa que la interfaz IDisposable no debe implementarse en todas las clases de ViewModel que se derivan de GalaSoft.MvvmLight.ViewModelBase (y la limpieza debe ser anulada)?
En caso afirmativo, no se puede usar using para las instancias de view-model ... Probablemente no entendí algo ... Por favor aclare ... ¿Cuáles son los beneficios de tal limpieza?
Gracias.
El problema es histórico. Al principio pensé que sería una buena idea obligar a todas las máquinas virtuales a ser identificables. Sin embargo, IDisposable tiene una intención diferente: una vez que la máquina virtual está dispuesta, se espera (por convención) que se recolectará la basura lo antes posible. Después de hablar con amigos, me doy cuenta de que forzar a todas las máquinas virtuales a ser identificables fue un error. Es por eso que reemplacé IDisposable por ICleanup. El objetivo de ICleanup es proporcionar una forma de limpiar máquinas virtuales (por ejemplo, enjuagando su estado para un almacenamiento persistente, cerrando flujos, etc.) pero no necesariamente de forma que se recolecten basura lo antes posible.
Nada le impide hacer que sus VM implementen IDisposable. Simplemente no quería mantener esta restricción en la clase ViewModelBase, por lo que esta interfaz se eliminará en V4.
El beneficio de tener ICleanup es que puede limpiar todas sus VM en una sola llamada de ViewModelLocator.Cleanup (). Es una sugerencia para los desarrolladores de VM que dicen que las VM deberían pensar en proporcionar un método de limpieza para sus máquinas virtuales.
¿Tiene sentido? Saludos, Laurent
Pequeña historia "interesante": después de haber encontrado programadores en mi equipo no había cancelado la suscripción a eventos, me ''lavaron'' como identificable en nuestra jerarquía de modelos de vista solo para cambiar mi opinión sobre si Dispose era el lugar correcto.
En algunas circunstancias, fue difícil llamar a Dispose debido a MEF y otras formas funky en las que creamos nuestros modelos de visualización. Esto me hizo preguntarme si era correcto. Y luego está el hecho de que Dispose necesita un poco de cuidado (y un fragmento) para hacerlo bien:
Actualización DG: eliminación, finalización y gestión de recursos
Más tarde, hice un trabajo de fin de semana en una aplicación WP7 (donde uso MVVM Light) y noté el cambio de corazón de Laurent también.
Creo que es la decisión correcta; IDisposable envía un mensaje que el "cliente" debe intentar y ajustar el uso de la clase en un uso () o de otra manera lavarse las manos de la instancia CUANTO ANTES.
Originalmente, estuve de acuerdo con la respuesta aceptada en el hilo a continuación, pero luego comencé a pensar que JaredPar tenía razón.
Usando IDisposable para cancelar la suscripción a eventos
Luke