क्या INTifyPropertyChanged को लागू करते समय विकल्पों की तुलना में [CallerMemberName] धीमा है?


99

अच्छे लेख हैं जो लागू करने के लिए अलग-अलग तरीके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]विकल्प की तुलना में विशेषता का प्रदर्शन खराब है। क्या यह सच है और क्यों? क्या यह प्रतिबिंब का उपयोग करता है?

जवाबों:


201

नहीं, इसका उपयोग[CallerMemberName] ऊपरी बुनियादी कार्यान्वयन की तुलना में धीमा नहीं है ।

ऐसा इसलिए है, क्योंकि इस MSDN पृष्ठ के अनुसार ,

कॉलर इंफ़ॉर्म वैल्यू को संकलन के समय इंटरमीडिएट लैंग्वेज (IL) में शाब्दिक के रूप में उत्सर्जित किया जाता है

हम देख सकते हैं कि किसी भी आईएल डिस्सेम्बलर ( आईएलएसपी जैसे ) के साथ: संपत्ति के "सेट" ऑपरेशन के लिए कोड बिल्कुल उसी तरह संकलित किया गया है: CallerMemberName के साथ विघटित संपत्ति

इसलिए यहाँ परावर्तन का कोई उपयोग नहीं है।

(नमूना VS2013 के साथ संकलित)


2
वही लिंक, लेकिन फ्रेंच के बजाय अंग्रेजी में: msdn.microsoft.com/en-us/library/hh534540(v=vs.110).aspx
— माइक डी क्लार्क

2
@MikedeKlerk यकीन नहीं है कि आपने इसे सीधे उत्तर में संपादित क्यों नहीं किया, हालांकि मैंने अब ऐसा किया है।
— इयान केम्प
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.