INotifyPropertyChangedを実装する場合、[CallerMemberName]は他の方法と比較して遅いですか?


98

実装のさまざまな方法をINotifyPropertyChanged提案する優れた記事があります

次の基本的な実装を検討してください。

class BasicClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void FirePropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    private int sampleIntField;

    public int SampleIntProperty
    {
        get { return sampleIntField; }
        set
        {
            if (value != sampleIntField)
            {
                sampleIntField = value;
                FirePropertyChanged("SampleIntProperty"); // ouch ! magic string here
            }
        }
    }
}

これに置き換えたいのですが。

using System.Runtime.CompilerServices;

class BetterClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    // Check the attribute in the following line :
    private void FirePropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    private int sampleIntField;

    public int SampleIntProperty
    {
        get { return sampleIntField; }
        set
        {
            if (value != sampleIntField)
            {
                sampleIntField = value;
                // no "magic string" in the following line :
                FirePropertyChanged();
            }
        }
    }
}

しかし[CallerMemberName]、他の方法と比較して属性のパフォーマンスが低いことを時々読みます。それは本当ですか、なぜですか?リフレクションを使用していますか?

回答:


200

いいえ、の使用は[CallerMemberName]上部の基本的な実装より遅くはありません。

これは、このMSDNページによると、

発信者情報の値は、コンパイル時に中間言語(IL)にリテラルとして出力されます

IL逆アセンブラ(ILSpyなど)を使用して確認できます。プロパティの "SET"操作のコードは、まったく同じ方法でコンパイルされます。 CallerMemberNameで逆コンパイルされたプロパティ

したがって、ここではリフレクションを使用しません。

(VS2013でコンパイルされたサンプル)


2
同じリンクですが、フランス語ではなく英語です:msdn.microsoft.com/en-us/library/hh534540(v
Mike de Klerk

2
@MikedeKlerkなぜそれを直接回答に編集しなかったのかわかりませんが、今は編集しました。
Ian Kemp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.