[CallerMemberName] có chậm so với các lựa chọn thay thế khi triển khai INotifyPropertyChanged không?


98

Có những bài báo hay đề xuất nhiều cách khác nhau để thực hiệnINotifyPropertyChanged .

Hãy xem xét cách triển khai cơ bản sau:

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
            }
        }
    }
}

Tôi muốn thay thế nó bằng cái này:

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();
            }
        }
    }
}

Nhưng đôi khi tôi đọc được rằng [CallerMemberName]thuộc tính này có hiệu suất kém so với các lựa chọn thay thế. Điều đó có đúng không và tại sao? Nó có sử dụng phản xạ không?

Câu trả lời:


200

Không, việc sử dụng [CallerMemberName]không chậm hơn việc triển khai cơ bản trên.

Điều này là do, theo trang MSDN này ,

Giá trị Thông tin người gọi được phát ra dưới dạng ký tự vào Ngôn ngữ Trung gian (IL) tại thời điểm biên dịch

Chúng tôi có thể kiểm tra rằng với bất kỳ trình tháo gỡ IL nào (như ILSpy ): mã cho hoạt động "SET" của thuộc tính được biên dịch chính xác theo cùng một cách: Thuộc tính đã được giải mã với CallerMemberName

Vì vậy, không sử dụng Reflection ở đây.

(mẫu biên dịch với VS2013)


2
Cùng một liên kết, nhưng bằng tiếng Anh thay vì tiếng Pháp: msdn.microsoft.com/en-us/library/hh534540(v=vs.110).aspx
Mike de Klerk

2
@MikedeKlerk Không chắc tại sao bạn không chỉnh sửa nó trực tiếp vào câu trả lời, mặc dù bây giờ tôi đã làm như vậy.
Ian Kemp,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.