Si está ejecutando MVVM y utilizando comandos, a menudo verá las propiedades de ICommand en ViewModel que están respaldadas por los campos privados RelayCommand o DelegateCommand, como este ejemplo del artículo original de MVVM en MSDN:Simplificar el comando RelayCommand/Delegate en WPF MVVM ViewModels
RelayCommand _saveCommand;
public ICommand SaveCommand
{
get
{
if (_saveCommand == null)
{
_saveCommand = new RelayCommand(param => this.Save(),
param => this.CanSave);
}
return _saveCommand;
}
}
Sin embargo, esta es una gran cantidad de desorden, y hace que la creación de nuevos comandos bastante tedioso (yo trabajo con algunos desarrolladores de Windows Forms veteranos que se resisten a todo esto de escribir). Así que quería simplificarlo y profundizar un poco. Establecí un punto de interrupción en la primera línea del bloque get {} y vi que solo se golpeó cuando mi aplicación se cargó por primera vez. Luego puedo disparar tantos comandos como quiera y este punto de interrupción nunca se golpea, así que quería simplificar esto para eliminar algunos desorden de mis ViewModels y se dio cuenta de que el siguiente código funciona de la misma:
public ICommand SaveCommand
{
get
{
return new RelayCommand(param => this.Save(), param => this.CanSave);
}
}
sin embargo, no sé lo suficiente sobre C# o el recolector de basura para saber si esto podría causar problemas, como generar basura excesiva en algunos casos. ¿Esto planteará algún problema?
Si realmente está preocupado por el uso de la memoria, ¿no tendría sentido solo crear instancias de los comandos que va a utilizar? Por ejemplo, si tiene una VM que expone 3 comandos, y solo se usa uno, simplemente descarte el resto. Si está utilizando todos sus comandos de máquina virtual (que debería ser), entonces su sistema de carga lenta usará MÁS memoria y MÁS tiempo de procesador, lo que en primer lugar frustra el objetivo de optimización, especialmente para los sistemas integrados. –