2015-02-08 13 views
18

.NET 4.5.3'ün ortaya çıkmasıyla, WPF geliştiricilerinin artık INotifyPropertyChanged Interface özellik değişikliklerini bildiren üç (veya daha fazla) yolu vardır. Temel olarak, benim soru olan .NET 4.5'ten başlayarak sunulan iki yöntemden hangisi, WPF'de kullanıldığında herhangi bir fayda olup olmadığını ve özellik değişikliklerini bildirmenin daha etkili bir yoludur? Bu konuda çok aşina olmayanlar için.NET 4.5.3'te özellik değişikliklerini bildirmek için CallerMemberNameAttribute yerine işlecinin adını kullanmanın herhangi bir yararı var mı?

Arkaplan

, burada ana üç yöntemlerdir. İlk basitçe bir dize geçirmeden orijinal, daha fazla hata eğilimli bir yöntemdir: İkinci yöntem .NET 4.5 tanıtıldı

public string TestValue 
{ 
    get { return testValue; } 
    set { testValue = value; NotifyPropertyChanged("TestValue"); } 
} 

protected virtual void NotifyPropertyChanged(string propertyName) 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

; CallerMemberNameAttribute:

public string TestValue 
{ 
    get { return testValue; } 
    set { testValue = value; NotifyPropertyChanged(); } 
} 

protected virtual void NotifyPropertyChanged([CallerMemberName]string propertyName = "") 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

üçüncü ve en son yöntem olan (veya yakında olacak) .NET 4.5.3 parçası olarak C# 6.0 tanıtıldı; nameof Operator:

public string TestValue 
{ 
    get { return testValue; } 
    set { testValue = value; NotifyPropertyChanged(nameof(TestValue)); } 
} 

protected virtual void NotifyPropertyChanged(string propertyName) 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

Kendi varsayım ben sadece diğer iki yöntem yansıma türü kullanıyor edebileceğiniz gibi sadece bir dize geçirmeden orijinal, daha fazla hata eğilimli yöntem, en verimli olacağını olurdu. Ancak, diğer iki yöntemin hangisinin daha verimli olduğunu ve WPF bağlamında CallerMemberNameAttribute özniteliği ile nameof işlecini kullanma arasında herhangi bir fark olup olmayacağını bulmaya gerçekten çok hevesliyim.

+0

"üçüncü ve son yöntem olan (veya yakında olacak) olarak C# 6.0 tanıtıldı .NET 4.5.3'ün bir parçası, Operatörün adı "- kesinlikle" nameofuz "bir dil özelliğidir (https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23 -6) ve çerçevenin bir parçası değil. –

cevap

24

Verimlilik hakkında: dize doğrudan derleyicide derlendiğinden, bir dize doğrudan doğruya kullanıldığında, CallerMemberNameAttribute, nameof tamamen aynıdır. Yansıma yok. Tüm seçenekler WPF bağlam ile hiçbir problem var sadece string olan zamanında bu yana

public string TestValue 
{ 
    get { return this.testValue; } 
    set { this.testValue = value; this.NotifyPropertyChanged("TestValue"); } 
} 
protected virtual void NotifyPropertyChanged(string propertyName) 
{ 
    if (this.PropertyChanged != null) 
    { 
     this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

:

public string TestValue 
{ 
    get { return this.testValue; } 
    set { this.testValue = value; this.NotifyPropertyChanged("TestValue"); } 
} 
protected virtual void NotifyPropertyChanged([CallerMemberName] string propertyName = "") 
{ 
    if (this.PropertyChanged != null) 
    { 
     this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Ve this for nameof:

Biz TryRoslyn kullanılarak produces this for CallerMemberNameAttribute görebilirsiniz.

kolaylık Hakkında

: CallerMemberNameAttributenameof değil iken isteğe bağlı bir parametre olmasını gerektirir ama nameofCallerMemberNameAttribute değil iken özelliği belirtmenizi gerektirir.

nameof'un o kadar popüler olduğu ortaya çıkacağını tahmin ediyorum, bunun yerine onu kullanmak çok daha kolay olurdu.

+1

Neden isim çok popüler olacak? CallerMemberNameAttribute öğesini bir kez veya genellikle en az (her özellikte kullanmak zorunda olduğunuz) addan daha az kullanmak daha kolaydır. Bu eğilimleri anlamıyorum ... Lütfen açıklayabilir misiniz? –

+0

@ElMac nameof, çok sayıda senaryoda popüler olmuştu ... sadece arayanın adını almak için değil. Daha fazla insan bunu bilir ve bunu burada kullanmak için kullanmak daha kolaydır. – i3arnon

6

CallerMemberNameAttribute sadece aranan işlevde kullanılabilir ve arayan işlevinin adını alabilirsiniz.

nameof operatörü bunun ötesine geçer. Her yerde kullanılabilir.

sen, sadece bağlama WPF veri kapsamında bu konuda akıl bu örneği almak istiyorsanız

:

public string FullName 
{ 
    get 
    { 
     return string.Format(
      "{0} {1}", 
      this.firstName, 
      this.lastName); 
    } 
} 

public string FirstName 
{ 
    get 
    { 
     return this.firstName; 
    } 
    set 
    { 
     if (value != this.firstName) 
     { 
      this.firstName = value; 
      NotifyPropertyChanged(nameof(FirstName)); 
      NotifyPropertyChanged(nameof(FullName)); 
     } 
    } 
} 

public string LasttName 
{ 
    get 
    { 
     return this.lastName; 
    } 
    set 
    { 
     if (value != this.lastName) 
     { 
      this.lastName = value; 
      NotifyPropertyChanged(nameof(LasttName)); 
      NotifyPropertyChanged(nameof(FullName)); 
     } 
    } 
}