表單構建自己的MVVM我有以下代碼,讓我們有類型安全的NotifyOfPropertyChange調用:
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);
}
這種方法與標準的簡單字符串方法相比如何?有時我的屬性會以非常高的頻率發生變化。我可以安全地使用這種類型安全的方法嗎?經過一些初步測試後,它似乎確實產生了一些小的差異。這種方法可能導致內存負載多少CPU?
提出這個代碼的代碼是什麼樣的?我猜它是這樣的:
NotifyOfPropertyChange(() => SomeVal);
這隱含著:
NotifyOfPropertyChange(() => this.SomeVal);
它捕獲了this
,並且非常多意味著每次都必須從頭開始構造表達式樹(使用Expression.Constant
)。然後你每次解析它。所以開銷肯定是非平凡的。
是不是太過分了 ?這是一個只有你可以回答的問題,通過你的應用程序的分析和知識。它被認為可以用於很多MVC,但這並不是(通常)在長時間運行的緊密循環中調用它。基本上,您需要針對所需的性能目標進行分析。
Emiel Jongerius與各種INotifyPropertyChanged實現的性能比較良好。
http://www.pochet.net/blog/2010/06/25/inotifypropertychanged-implementations-an-overview/
最重要的是,如果您在UI上使用INotifyPropertyChanged進行數據綁定,那麼不同版本的性能差異是微不足道的。