2011-06-25 11 views
8

मैं थोड़ी देर के लिए सी # सीख रहा हूं, और मैं अपनी सी # पुस्तक (हेड फर्स्ट सी #) में गुणों में आया हूं। मैं ईमानदारी से समझ में नहीं आता कि उनका क्या उपयोग किया जाता है, और मुझे उनका उपयोग क्यों करना चाहिए। मैंने उन्हें कुछ बार गुमराह किया है लेकिन अभी भी मेरे जीवन के लिए उन्हें समझ नहीं सकते हैं।कृपया बताएं कि सी # गुण कैसे काम करते हैं?

क्या कोई मुझे इस विदेशी अवधारणा को समझा सकता है?

धन्यवाद,

Varmitharen

+1

विदेशी * * की तुलना में *? आप वर्तमान में क्या उपयोग कर रहे हैं? सार्वजनिक क्षेत्र? –

+0

हाँ, सामान्य फ़ील्ड – Varmitharen

+2

हाँ, ऐसा मत करो; सार्वजनिक क्षेत्र लगभग कभी भी एक अच्छा विचार नहीं है। –

उत्तर

3

गुण के लिए वस्तु उन्मुख प्रोग्रामिंग की इनकैप्सुलेशन अवधारणा को बेहतर बनाने के लिए किया जाता है।

यानी वे फ़ील्ड-सदस्य को समाहित करते हैं और आपको (डेवलपर) नियंत्रित करते हैं कि इस चर को कैसे स्थापित/प्राप्त किया जा रहा है। उदाहरण?

public class Person 
{ 
    private int m_age; 

    public int Age 
    { 
     set 
     { 
      if(value < 18) 
       m_age = 18; 
      else 
       m_age = value; 
     } 
     get 
     { 
      return m_age; 
     } 
    } 
} 

देखें? संपत्ति Age का उपयोग करके, हम गारंटी देते हैं कि आयु का न्यूनतम सेट मूल्य 18 है।

+0

वे आवश्यक रूप से फ़ील्ड सदस्य को समाहित नहीं करते हैं। – jason

+0

और जब भी वे एक फील्ड सदस्य को समाहित करते हैं, तब भी फ़ील्ड सदस्य आवश्यक रूप से संपत्ति के समान प्रकार नहीं होता है। मुझे यह उदाहरण पसंद नहीं है; मैं आमतौर पर उन गुणों को प्राथमिकता देता हूं जिनमें 'get' और' set 'दोनों होते हैं,' get' 'मान को' सेट 'वापस लौटाते हैं। – Brian

+0

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

1

आप क्षेत्रों के साथ परिचित है, तो कर रहे हैं करने के लिए लग रही है? यदि ऐसा है, तो कोड के दृष्टिकोण से जो आपकी कक्षा का उपभोग करता है, गुण बिल्कुल फ़ील्ड की तरह हैं। हालांकि आपकी कक्षा के अंदर, एक संपत्ति विधियों की एक जोड़ी की तरह है, जो उपभोक्ता को मूल्य लौटने से संबंधित है, और एक विधि जो मूल्य को अद्यतन करने से संबंधित है। इन तरीकों को आम तौर पर getters और setters कहा जाता है।

किसी क्षेत्र की बजाय संपत्ति का उपयोग करने के लिए एक अच्छा कारण यह है कि यह आपको संपत्ति के अंदर और बाहर जाने वाले मूल्यों का बेहतर नियंत्रण देता है।

17

गुण नियंत्रित डेटा तक पहुंच प्रदान करते हैं;

public int Foo {get;set;} // the compiler handles the field for you 

हालांकि, आप संपत्ति तर्क लागू करने या पक्ष को संभालने के लिए इस्तेमाल कर सकते हैं: सबसे बुनियादी में, यह सिर्फ एक क्षेत्र (सार्वजनिक क्षेत्रों अनुशंसित नहीं हैं) है, जो संकलक आप के लिए आसान बना सकते हैं encapsulating मतलब हो सकता है प्रभाव:

01:

private int foo; 
public int Foo { 
    get { return foo; } 
    set { 
     if(value < 0) throw new ArgumentOutOfRangeException(); 
     if(value != foo) { 
      foo = value; 
      OnFooChanged(); // fire event notification for UI bindings 
     } 
    } 
} 

अन्य आम विकल्प आलसी लोडिंग, गणना के सदस्यों, प्रॉक्सी सदस्यों, आदि

तुम भी उदाहरण के लिए पहुँच को बदल सकते हैं, कर रहे हैं

जो को प्रकार और उप-वर्गों द्वारा असाइन किए गए कोड से नहीं, निर्दिष्ट किया जा सकता है। यह में केवल एक प्राप्त या सेट हो सकता है।

असल में, गुण तरीकों की एक प्राप्त/सेट जोड़ी की एक और अधिक औपचारिक संस्करण के रूप में कार्य है, यह बहुत आसान है "फू" के बारे में बात करने के लिए कर रही है, के बजाय "get_Foo"/"set_Foo" आदि (दो तरह के लिए बंधन)।

क्षेत्रों के विपरीत, गुण भी इंटरफेस पर विज्ञापित किया जा सकता है, जो आवश्यक है इंटरफ़ेस आधारित कोड

+0

फ़ील्ड पर भी बुनियादी कंपाइलर उत्पन्न गुणों का एक अन्य कारण यह है कि यह आपको बाद में लचीलापन देता है जब गेटटर और सेटर के तर्क को पुन: कार्यान्वित करते समय यदि उपभोग करने वाले कोड को पुन: संकलित किए बिना आवश्यकता हो। यदि आप फ़ील्ड्स प्रकाशित करते हैं और फिर तय करते हैं कि आप सेटर लॉजिक को लागू करना चाहते हैं, तो आपको फ़ील्ड को निजी बनाना होगा, एक संपत्ति लागू करना होगा और फिर आपके कोड का उपभोग करने वाले सभी को फिर से कंपाइल करना होगा। – jasonh

17

हालांकि अन्य उत्तरों बहुत अच्छे हैं, लेकिन वे तंत्र गुणों के बारे में बहुत कुछ हैं। गुणों के दर्शन को समझना भी सहायक है।

ओओ प्रोग्रामिंग में हम अर्थपूर्ण डोमेन के मॉडल बनाने के लिए काफी समय बिताते हैं। जब आप कहते हैं कि आपके पास एक वर्ग "पशु" और एक व्युत्पन्न वर्ग "टाइगर" है, तो आप कंप्यूटर क्षेत्र में मॉडलिंग कर रहे हैं वास्तविक दुनिया के बारे में एक तथ्य: दुनिया की सभी चीजों में से, उनमें से कुछ जानवर हैं, और उन जानवरों में से कुछ बाघ हैं।

लेकिन आप यह समझना होगा कि तंत्र और अर्थ विज्ञान अलग हैं। कोई भी नहीं कहता है "अरे, चलो चिड़ियाघर में जाएं और बाघों के उदाहरणों पर IFeedable पर ज़ूकीपर के तरीकों का आह्वान करें"।

एक फ़ील्ड तंत्र है और इसलिए कक्षा का निजी कार्यान्वयन विवरण होना चाहिए; यह मॉडल के हिस्से का वर्णन नहीं करता है। एक संपत्ति अर्थात् मॉडल का एक हिस्सा है। प्रत्येक बाघ का जन्मदिन होता है, इसलिए "जन्मदिन" टाइगर वर्ग की संपत्ति होनी चाहिए। यह बाघों के "अर्थात् मॉडल" का हिस्सा है, इसलिए इसे एक संपत्ति के रूप में बेनकाब करें। कार्यान्वयन के विवरण के रूप में, जन्मदिन संपत्ति द्वारा उपयोग किए जाने वाले निजी क्षेत्र में संग्रहीत किया जा सकता है।

क्या यह समझ में आता है? संक्षेप में: उन मॉडलों के अर्थपूर्ण गुणों का वर्णन करने के लिए सार्वजनिक गुणों का उपयोग करें जिन्हें आप मॉडलिंग कर रहे हैं; कार्यान्वयन तंत्र के रूप में निजी क्षेत्रों का उपयोग करें।

+1

'IFeedable' को' INomNomNomable' के पक्ष में बहिष्कृत किया गया था। – wootscootinboogie

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