CallerMemberName是如何實現的?我應該提供一個名爲nameof的成員名稱的方法,還是應該依賴CallerMemberName爲我做?
我得到它所做的 - 它允許我們將魔術串從我們的代碼中取出 - 但是它應該被用於nameof
以及什麼更高性能?
什麼區別/ CallerMemberName如何正確工作?
CallerMemberName是如何實現的?我應該提供一個名爲nameof的成員名稱的方法,還是應該依賴CallerMemberName爲我做?
我得到它所做的 - 它允許我們將魔術串從我們的代碼中取出 - 但是它應該被用於nameof
以及什麼更高性能?
什麼區別/ CallerMemberName如何正確工作?
CallerMemberName
是一種編譯技巧,可以將當前成員的名稱放在另一個方法的調用中。 nameof
也是一個編譯時候的技巧,可以做類似的事情:它需要成員的字符串表示形式。
使用哪個取決於您。我會說:你可以使用CallerMemberName
,你必須使用nameof
。 CallerMemberName
比nameof
更自動化,所以我更喜歡那個。
兩者都具有相同的性能意義:僅在編譯時需要額外的時間來評估代碼,但這是可以忽略的。
所以這些調用變成了帶有字符串的簡單調用(如果我使用字符串文字而不是nameof?) – Mafii
的確如此。這完全一樣。 –
[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; }
}
它們是針對兩個不相關的場景。 CallerMemberName告訴你誰在給你打電話,'nameof'告訴你你打給誰。 – GSerg
我認爲問題是:我應該使用'nameof'提供一個帶有成員名稱的方法,還是應該依靠'CallerMemberName'來爲我做? –
@PatrickHofman true,ill編輯 – Mafii