2010-04-02 11 views
6

मेरे पहले प्रयास पर विचार करें, एफ # में एक साधारण प्रकार निम्न जैसा है:मैं एफ # में एक संपत्ति को सही ढंग से कैसे कार्यान्वित करूं?

type Test() = 
    inherit BaseImplementingNotifyPropertyChangedViaOnPropertyChanged() 
    let mutable prop: string = null 
    member this.Prop 
     with public get() = prop 
     and public set value = 
      match value with 
       | _ when value = prop ->() 
       | _ -> 
        let prop = value 
        this.OnPropertyChanged("Prop") 

अब मैं इसे सी # के माध्यम से जांचता हूं (इस ऑब्जेक्ट को सी # प्रोजेक्ट के संपर्क में लाया जा रहा है, इसलिए स्पष्ट सी # अर्थशास्त्र वांछनीय हैं):

[TestMethod] 
public void TaskMaster_Test() 
{ 
    var target = new FTest(); 
    string propName = null; 
    target.PropertyChanged += (s, a) => propName = a.PropertyName; 
    target.Prop = "newString"; 

    Assert.AreEqual("Prop", propName); 
    Assert.AreEqual("newString", target.Prop); 

    return; 
} 

propName ठीक से असाइन किया गया है, मेरा एफ # सेटर चल रहा है, लेकिन दूसरा जोर विफल रहा है क्योंकि prop का अंतर्निहित मान नहीं बदला गया है। इस प्रकार का मुझे समझ में आता है, क्योंकि अगर मैं prop फ़ील्ड से mutable को हटाता हूं, तो कोई त्रुटि उत्पन्न नहीं होती है (और एक होना चाहिए क्योंकि मैं मान को म्यूट करने की कोशिश कर रहा हूं)। मुझे लगता है कि मुझे एक मौलिक अवधारणा याद आ रही है।

Test कक्षा में prop को पुनर्निर्मित/परिवर्तित करने का सही तरीका क्या है ताकि मैं अपना यूनिट परीक्षण पास कर सकूं?

उत्तर

8

इस प्रयास करें:

type Test() = 
    inherit BaseImplementingNotifyPropertyChangedViaOnPropertyChanged() 
    let mutable prop: string = null 
    member this.Prop 
     with public get() = prop 
     and public set value = 
      match value with 
       | _ when value = prop ->() 
       | _ -> 
        prop <- value 
        this.OnPropertyChanged("Prop") 

आप बाध्यकारी परिवर्तनशील बनाने के लिए और फिर अपने सेटर में अपने मूल्य को बदलने की जरूरत है। आपके प्रारंभिक कोड में, आप बस अपने सेटटर के भीतर एक नया बाध्यकारी (जिसे prop भी कहा जाता है) बना रहा था, इसलिए कोई परिवर्तन दिखाई नहीं दे रहा था।

+0

धन्यवाद, @kvb। कुछ भी मुझे इस तरह के एक फिक्स की तुलना में भाषा में n00b की तरह महसूस नहीं करता है। :) –

+0

@ ग्रेग - कोई समस्या नहीं। जिस तरह से बाइंडिंग और छायांकन कार्य का उपयोग करने में थोड़ा सा समय लग सकता है, खासकर जब से अन्य भाषाएं अलग-अलग चीजें करती हैं। हालांकि, एक बार जब आप अपना मानसिक मॉडल सीधे प्राप्त कर लेते हैं, तो मुझे लगता है कि एफ # के दृष्टिकोण का लालित्य स्पष्ट हो जाता है। – kvb

5

अपने पैटर्न मैच में आप वास्तव में

let prop = value 

के साथ एक नया मूल्य बाध्यकारी हैं जब आप ही नाम के साथ इस तरह एक मूल्य के लिए बाध्य है, यह नव घोषित एक की गुंजाइश के लिए अन्य मूल्य शैडो होगा। मेरा मानना ​​है कि क्या आप वास्तव में क्या करना चाहते हैं यह है:

prop <- value 
9

अतिरिक्त नोट के रूप में, मैं शायद match निर्माण के बजाय if .. then का प्रयोग करेंगे के रूप में यह कोड अधिक संक्षिप्त बनाता है (patterh मिलान विशेष रूप से महत्वपूर्ण है जब आप की जरूरत है मूल्य को फिर से कई जटिल पैटर्न का परीक्षण करने के लिए)। इसके अलावा, publicmember के लिए डिफ़ॉल्ट पहुँच है, तो आप कोड में थोड़ा और अधिक संक्षिप्त कर सकते हैं:

type Test() = 
    inherit BaseImplementingNotifyPropertyChangedViaOnPropertyChanged() 
    let mutable prop : string = null 
    member this.Prop 
     with get() = prop 
     and set(value) = 
      if value <> prop then 
       prop <- value 
       this.OnPropertyChanged("Prop") 
+1

मैंने पूरी तरह से अपनी पुस्तक खरीदी है। :) उपयोगी पठन, हालांकि मैं चाहता हूं कि जब मैं इस सवाल से पूछा तो मैं इसे आसान रखूंगा! –

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