2016-06-21 65 views
2

CallerMemberName是如何實現的?我應該提供一個名爲nameof的成員名稱的方法,還是應該依賴CallerMemberName爲我做?

我得到它所做的 - 它允許我們將魔術串從我們的代碼中取出 - 但是它應該被用於nameof以及什麼更高性能?

什麼區別/ CallerMemberName如何正確工作?

+3

它們是針對兩個不相關的場景。 CallerMemberName告訴你誰在給你打電話,'nameof'告訴你你打給誰。 – GSerg

+2

我認爲問題是:我應該使用'nameof'提供一個帶有成員名稱的方法,還是應該依靠'CallerMemberName'來爲我做? –

+0

@PatrickHofman true,ill編輯 – Mafii

回答

4

CallerMemberName是一種編譯技巧,可以將當前成員的名稱放在另一個方法的調用中。 nameof也是一個編譯時候的技巧,可以做類似的事情:它需要成員的字符串表示形式。

使用哪個取決於您。我會說:你可以使用CallerMemberName,你必須使用nameofCallerMemberNamenameof更自動化,所以我更喜歡那個。

兩者都具有相同的性能意義:僅在編譯時需要額外的時間來評估代碼,但這是可以忽略的。

+0

所以這些調用變成了帶有字符串的簡單調用(如果我使用字符串文字而不是nameof?) – Mafii

+1

的確如此。這完全一樣。 –

4

[CallerMemberName]nameof不完全可以互換。有時你需要第一個,有時甚至是第二個,即使當我們談論相同的方法時:

class Foo : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private string title; 

    public string Title 
    { 
     get { return title; } 
     set 
     { 
      if (title != value) 
      { 
       title = value; 
       // we're using CallerMemberName here 
       OnPropertyChanged(); 
      } 
     } 
    } 

    public void Add(decimal value) 
    { 
     Amount += value; 
     // we can't use CallerMemberName here, because it will be "Add"; 
     // instead of this we have to use "nameof" to tell, what property was changed 
     OnPropertyChanged(nameof(Amount)); 
    } 

    public decimal Amount { get; private set; } 
} 
相關問題