typesafe NotifyPropertyChanged mit Linq-Ausdrücken

expression-trees inotifypropertychanged mvvm wpf

Frage

Formular Erstellen Sie Ihre eigene MVVM Ich habe den folgenden Code, mit dem wir typsichere NotifyOfPropertyChange-Aufrufe haben können:

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

Wie wird dieser Ansatz im Vergleich zu standardmäßigen einfachen Strings performance-mäßig verglichen? Manchmal habe ich Eigenschaften, die sich sehr häufig ändern. Kann ich diesen typsicheren Ansatz verwenden? Nach einigen ersten Tests scheint es einen kleinen Unterschied zu machen. Wie viel CPU-Speicherlast kann dieser Ansatz möglicherweise induzieren?

Akzeptierte Antwort

Wie sieht der Code aus, der das verursacht? Ich vermute es ist etwas wie:

NotifyOfPropertyChange(() => SomeVal);

was implizit ist:

NotifyOfPropertyChange(() => SomeVal);

was bedeutet, dass eine Aufnahme this und ziemlich viel bedeutet, dass der Ausdrucksbaum jedes Mal (mit Expression.Constant ) von Grund auf neu konstruiert werden muss . Und dann parst du es jedes Mal. Der Overhead ist also definitiv nicht trivial.

Ist das aber zu viel ? Das ist eine Frage, die nur Sie beantworten können, mit Profiling und Wissen über Ihre App. Es wird für viele MVC-Verwendung als OK angesehen, aber das nennt es (allgemein) nicht in einer lang andauernden engen Schleife. Sie müssen im Grunde gegen ein gewünschtes Leistungsziel profilieren.


Beliebte Antwort

Emiel Jongerius hat einen guten Leistungsvergleich der verschiedenen INotifyPropertyChanged-Implementierungen.

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

Die unterste Zeile ist, wenn Sie INotifyPropertyChanged für die Datenbindung auf einer Benutzeroberfläche verwenden, dann sind die Leistungsunterschiede der verschiedenen Versionen unbedeutend.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum