2015-02-08 6 views
18

.NET 4.5.3 के आगमन के साथ, WPF डेवलपर्स के पास अब संपत्ति परिवर्तनों के INotifyPropertyChanged Interface को सूचित करने के तीन (या अधिक) तरीके हैं। असल में, मेरा प्रश्न है .NET 4.5 से शुरू की गई दो विधियों में से कौन सा संपत्ति परिवर्तनों को सूचित करने का और अधिक प्रभावी तरीका है और क्या WPF में उपयोग किए जाने पर किसी भी तरह का कोई लाभ है?क्या .NET 4.5.3 में संपत्ति परिवर्तनों को सूचित करने के लिए CallerMemberNameAttribute के बजाय नाम के ऑपरेटर का उपयोग करने का कोई लाभ है?

पृष्ठभूमि

उन इस विषय के साथ इतना परिचित नहीं के लिए, यहाँ मुख्य तीन तरीके हैं। पहले बस एक स्ट्रिंग पास करने का मूल है, और अधिक त्रुटियों की संभावना विधि है:

public string TestValue 
{ 
    get { return testValue; } 
    set { testValue = value; NotifyPropertyChanged("TestValue"); } 
} 

protected virtual void NotifyPropertyChanged(string propertyName) 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

दूसरी विधि में .NET 4.5 पेश किया गया था; CallerMemberNameAttribute:

public string TestValue 
{ 
    get { return testValue; } 
    set { testValue = value; NotifyPropertyChanged(); } 
} 

protected virtual void NotifyPropertyChanged([CallerMemberName]string propertyName = "") 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

तीसरे और सबसे हाल ही में विधि थी (या जल्दी ही हो जाएगा) नेट 4.5.3 के हिस्से के रूप में शुरू की गई सी # 6.0; nameof Operator:

public string TestValue 
{ 
    get { return testValue; } 
    set { testValue = value; NotifyPropertyChanged(nameof(TestValue)); } 
} 

protected virtual void NotifyPropertyChanged(string propertyName) 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

मेरा अपना धारणा होगा कि बस एक स्ट्रिंग पास करने का मूल है, और अधिक त्रुटियों की संभावना विधि, सबसे कारगर होगा के रूप में मैं केवल कल्पना कर सकते हैं कि अन्य दो तरीकों प्रतिबिंब के कुछ फार्म का उपयोग करें। हालांकि, मैं वास्तव में यह जानना चाहता हूं कि अन्य दो तरीकों में से कौन सा और अधिक कुशल है और क्या वास्तव में CallerMemberNameAttribute विशेषता और nameof ऑपरेटर का उपयोग WPF संदर्भ में करने के बीच वास्तव में कोई अंतर होगा।

+0

"तीसरी और सबसे हाल ही में विधि था (या जल्दी ही हो जाएगा) के रूप में में शुरू सी # 6.0 .NET 4.5.3 का हिस्सा; ऑपरेटर का नाम "- सख्ती से बोलना 'nameof' एक [भाषा सुविधा] है (https://github.com/dotnet/roslyn/wiki/New-Language- विशेषताएं-in-C%23 -6) और ढांचे का एक हिस्सा नहीं है। –

उत्तर

24

दक्षता के बारे में: सीधे एक स्ट्रिंग का उपयोग करके, CallerMemberNameAttribute, nameof संकलन-समय पर संकलक द्वारा स्ट्रिंग इंजेक्शन के बाद से बिल्कुल वही हैं। कोई प्रतिबिंब शामिल नहीं है।

public string TestValue 
{ 
    get { return this.testValue; } 
    set { this.testValue = value; this.NotifyPropertyChanged("TestValue"); } 
} 
protected virtual void NotifyPropertyChanged([CallerMemberName] string propertyName = "") 
{ 
    if (this.PropertyChanged != null) 
    { 
     this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

और this for nameof:

public string TestValue 
{ 
    get { return this.testValue; } 
    set { this.testValue = value; this.NotifyPropertyChanged("TestValue"); } 
} 
protected virtual void NotifyPropertyChanged(string propertyName) 
{ 
    if (this.PropertyChanged != null) 
    { 
     this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

कार्यावधि में के बाद से सभी विकल्पों को बस एक string हैं वहाँ WPF संदर्भ के साथ कोई समस्या नहीं है

हम उस TryRoslyn का उपयोग कर कि produces this for CallerMemberNameAttribute देख सकते हैं।

सुविधा के बारे में: CallerMemberNameAttribute जबकि nameof नहीं है एक वैकल्पिक पैरामीटर की अपेक्षा करती है लेकिन nameof जबकि CallerMemberNameAttribute नहीं है संपत्ति निर्दिष्ट करने के लिए की आवश्यकता है।

मुझे लगता है कि nameof इतना लोकप्रिय हो जाएगा कि इसके बजाय इसका उपयोग करना बहुत आसान होगा।

+1

नाम का नाम इतना लोकप्रिय क्यों होगा? CallerMemberNameAttribute का उपयोग एक बार की तरह करना, या आम तौर पर कम से कम नाम से कम करना (जिसे आपको प्रत्येक संपत्ति में उपयोग करना होगा) का उपयोग करना बहुत आसान है। मैं इन प्रवृत्तियों को समझ नहीं पा रहा हूं ... क्या आप कृपया समझा सकते हैं? –

+0

@ElMac नाम पहले से ही कई परिदृश्यों में लोकप्रिय हो गया है ... न केवल कॉलर का नाम प्राप्त करने के लिए। अधिक लोग इसे जानते हैं और इसे पूरे समय उपयोग करते हैं, इसलिए इसे यहां उपयोग करना आसान है। – i3arnon

6

CallerMemberNameAttribute केवल कॉलर फ़ंक्शन का नाम प्राप्त करने वाले फ़ंक्शन पर उपयोग किया जा सकता है।

nameof ऑपरेटर इससे आगे निकलता है। इसे कहीं भी इस्तेमाल किया जा सकता है।

आप, बस बाध्यकारी WPF डेटा के दायरे में इसके बारे में कारण इस उदाहरण लेना चाहते हैं:

public string FullName 
{ 
    get 
    { 
     return string.Format(
      "{0} {1}", 
      this.firstName, 
      this.lastName); 
    } 
} 

public string FirstName 
{ 
    get 
    { 
     return this.firstName; 
    } 
    set 
    { 
     if (value != this.firstName) 
     { 
      this.firstName = value; 
      NotifyPropertyChanged(nameof(FirstName)); 
      NotifyPropertyChanged(nameof(FullName)); 
     } 
    } 
} 

public string LasttName 
{ 
    get 
    { 
     return this.lastName; 
    } 
    set 
    { 
     if (value != this.lastName) 
     { 
      this.lastName = value; 
      NotifyPropertyChanged(nameof(LasttName)); 
      NotifyPropertyChanged(nameof(FullName)); 
     } 
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे