typesafe NotifyPropertyChanged à l'aide d'expressions linq

expression-trees inotifypropertychanged mvvm wpf

Question

Construisez votre propre MVVM J'ai le code suivant qui nous permet d'avoir des appels NotifyOfPropertyChange de typesafe:

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);
 }

Comment cette approche se compare-t-elle à l'approche standard par chaînes simples? Parfois, j'ai des propriétés qui changent très souvent. Suis-je sûr d'utiliser cette approche sécurisée? Après quelques premiers tests, cela semble faire une petite différence. Quelle est la quantité de CPU induite par la charge de mémoire par cette approche?

Réponse acceptée

À quoi ressemble le code qui pose cette question? Je devine que c'est quelque chose comme:

NotifyOfPropertyChange(() => SomeVal);

qui est implicitement:

NotifyOfPropertyChange(() => SomeVal);

qui ne capture de this , jolie et bien signifie que l'arbre d'expression doit être construite (avec Expression.Constant ) à partir de zéro à chaque fois. Et puis vous analysez à chaque fois. Donc, les frais généraux sont vraiment non négligeables.

Est-ce trop, cependant? C’est une question à laquelle vous seul pouvez répondre, avec profilage et connaissance de votre application. Il est considéré comme acceptable pour une grande partie de l'utilisation de MVC, mais ce n'est pas (généralement) appelé dans une boucle serrée de longue durée. En gros, vous devez établir un profil par rapport à une cible de performance souhaitée.


Réponse populaire

Emiel Jongerius a une bonne performance en termes de performances des différentes implémentations INotifyPropertyChanged.

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

En bout de ligne, si vous utilisez INotifyPropertyChanged pour la liaison de données sur une interface utilisateur, les différences de performances entre les différentes versions sont non significatives.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi