[CallerMemberName] ทำงานช้าเมื่อเทียบกับทางเลือกอื่นเมื่อใช้ INotifyPropertyChanged หรือไม่


101

มีบทความที่ดีที่แนะนำให้มีวิธีการที่แตกต่างกันสำหรับการดำเนินการ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]แอตทริบิวต์มีประสิทธิภาพต่ำเมื่อเทียบกับทางเลือกอื่น เป็นเช่นนั้นจริงหรือทำไม? ใช้การสะท้อนแสงหรือไม่?

คำตอบ:


206

ไม่การใช้งาน[CallerMemberName]ไม่ช้ากว่าการใช้งานขั้นพื้นฐานด้านบน

นี้เป็นเพราะตามหน้านี้ MSDN ,

ค่าข้อมูลผู้โทรจะถูกปล่อยออกมาเป็นตัวอักษรในภาษากลาง (IL) ในเวลาคอมไพล์

เราสามารถตรวจสอบได้ว่าด้วยตัวถอดชิ้นส่วน IL (เช่นILSpy ): รหัสสำหรับการดำเนินการ "SET" ของคุณสมบัติถูกรวบรวมในลักษณะเดียวกันทุกประการ: คุณสมบัติที่แยกย่อยด้วย CallerMemberName

ดังนั้นอย่าใช้ Reflection ที่นี่

(ตัวอย่างที่รวบรวมด้วย VS2013)


2
ลิงก์เดียวกัน แต่เป็นภาษาอังกฤษแทนภาษาฝรั่งเศส: msdn.microsoft.com/en-us/library/hh534540(v=vs.110).aspx
Mike de Klerk

2
@MikedeKlerk ไม่แน่ใจว่าทำไมคุณถึงไม่แก้ไขลงในคำตอบโดยตรงแม้ว่าตอนนี้ฉันได้ทำไปแล้วก็ตาม
Ian Kemp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.