क्या 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.