Mecanografiar a prueba de fallos Notificar a la propiedad modificada usando expresiones linq

expression-trees inotifypropertychanged mvvm wpf

Pregunta

Formulario Cree su propio MVVM Tengo el siguiente código que nos permite realizar llamadas a NotifyOfPropertyChange seguras para los tipos:

public void NotifyOfPropertyChange<TProperty>(Expression<Func<TProperty>> property)
{
    var lambda = (LambdaExpression)property;
    MemberExpression memberExpression;
    if (lambda.Body is UnaryExpression)
    {
        var unaryExpression = (UnaryExpression)lambda.Body;
        memberExpression = (MemberExpression)unaryExpression.Operand;
    }
    else memberExpression = (MemberExpression)lambda.Body;
    NotifyOfPropertyChange(memberExpression.Member.Name);
 }

¿Cómo se compara este enfoque con el enfoque de cadenas simples y de rendimiento? A veces tengo propiedades que cambian a una frecuencia muy alta. ¿Estoy seguro de usar este enfoque de seguridad? Después de algunas primeras pruebas, parece hacer una pequeña diferencia. ¿Cuánta CPU que induce potencialmente esta carga de memoria?

Respuesta aceptada

¿A qué se parece el código que plantea esto? Supongo que es algo así como:

NotifyOfPropertyChange(() => SomeVal);

que es implícitamente:

NotifyOfPropertyChange(() => this.SomeVal);

lo que hace una captura de this , y prácticamente significa que el árbol de expresiones debe construirse (con Expression.Constant ) desde cero cada vez. Y luego lo analizas cada vez. Así que la sobrecarga es definitivamente no trivial.

¿Es demasiado sin embargo? Esa es una pregunta que solo usted puede responder, con el perfil y el conocimiento de su aplicación. Se considera que está bien para una gran cantidad de uso de MVC, pero eso no es (generalmente) llamarlo en un ciclo cerrado de larga duración. Básicamente, debe perfilar contra un objetivo de rendimiento deseado.


Respuesta popular

Emiel Jongerius tiene un buen desempeño en comparación con las diversas implementaciones de INotifyPropertyChanged.

http://www.pochet.net/blog/2010/06/25/inotifypropertychanged-implementations-an-overview/

La conclusión es que si está utilizando INotifyPropertyChanged para el enlace de datos en una interfaz de usuario, las diferencias de rendimiento de las diferentes versiones son insignificantes.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow