2011-02-01 18 views
6

बस सोच रहा है ...क्या 'संरक्षित' गुणों का उपयोग न करने का कोई कारण है?

क्या संरक्षित गुणों का उपयोग न करने के कोई कारण हैं?

मैं बजाय इस का उपयोग करने का मतलब है:

public abstract class Foo 
{ 
    protected Bar { get; private set; } 
} 

उपयोग करने के लिए यह एक:

public abstract class Foo 
{ 
    private Bar _bar; 

    protected Foo(Bar bar) 
    { 
     _bar = bar; 
    } 

    protected GetBar() 
    { 
     return _bar; 
    } 
} 
+7

दूसरा एक पूरी तरह से मान्य जावा है; इसलिए यदि आप उस तरह सी # कोड देखते हैं, तो सबसे संभावित कारण यह है कि यह एक जावा प्रोग्रामर द्वारा लिखा गया है, जो वास्तव में सी # तक वास्तव में समायोजित नहीं हुआ है। –

+2

आप पहुंच के लिए 'संरक्षित' का उपयोग करते हैं, इसमें गुणों के साथ कुछ भी नहीं है। – leppie

उत्तर

9

मैं किसी भी कारण नहीं दिख रहा है यही कारण है कि आप की परवाह किए बिना एक संपत्ति के बजाय एक GetXXX() विधि का प्रयोग करेंगे यह modifiers है।

चूंकि आपने इस प्रश्न को C# टैग के साथ टैग किया है, इसलिए मैं सख्ती से पहले दृष्टिकोण का उपयोग करने की अनुशंसा करता हूं। यही गुण है।

केवल एक विधि का उपयोग करें, जब हर बार जब आप इसे स्टेटस के बावजूद कॉल करते हैं तो यह मूल्य अलग हो सकता है। उदाहरण के लिए, DateTime.Now एक गलती थी और एक विधि होनी चाहिए थी।

अधिक जानकारी के लिए संपत्ति Usage Guidelines on MSDN देखें। एक तरफ ध्यान दें, यह आश्चर्य की बात है कि उन्हें Framework 1.1 के बाद से इसे बदलने की आवश्यकता क्यों नहीं है।

+1

जैसा कि ऊपर उल्लिखित किया गया है, यह शायद जावा या जावा प्रोग्रामर के काम से पोर्ट किया गया कोड है - यह जावा में मानक है। –

+0

कोई आवश्यकता नहीं है कि संपत्ति बेवकूफ होनी चाहिए। यह केवल दुष्प्रभाव के साथ 'शुद्ध' होना चाहिए। – leppie

+0

@leppie: यदि आप दिशानिर्देशों को देखते हैं, तो सूची में से एक है जब विधियों का उपयोग किया जाना चाहिए जो कहता है कि उत्तराधिकार में दो बार सदस्य को कॉल करना अलग-अलग परिणाम उत्पन्न करता है। बेशक, यह कोई साइड इफेक्ट्स होने का भी उल्लेख करता है। – decyclone

0

केवल अगर तुम वर्ग

+0

कृपया विस्तृत करें, आपका उत्तर बिल्कुल स्पष्ट नहीं है। – leppie

1

कुछ और कारणों के तरीकों के बजाय गुण का उपयोग करने के अंदर गैर लिखने योग्य या गैर पठनीय गुण है:

  • डाटा बाध्यकारी केवल गुण देख सकते हैं
  • आप केवल पढ़ने के लिए या केवल semantics लिख सकते हैं।
0

प्रश्न वास्तव में protected के बारे में अधिक जानकारी नहीं है: मुझे गुणों का उपयोग क्यों करना चाहिए?

propeties मनुष्य/सेटर विधि जोड़े, जो कुछ भी आप एक Name {get{} \ set{}} विशेष रूप से के रूप में सी # गेटर और सेटर accessors है आप एक GetName() \ SetName() जोड़ी और इसके विपरीत के साथ कर सकते के साथ एक साथ कर सकते हैं के साथ तार्किक बराबर हैं, तो हम साथ खेल सकते हैं अभिगम्यता भी।

लेकिन, कुछ ऐसे लोग हैं जो महसूस करते हैं कि सार्वजनिक (या संरक्षित) गुण ओओपी परिप्रेक्ष्य से धोखा देने जैसा थोड़ा सा हैं, खासकर यदि संपत्ति जो कुछ करता है वह केवल बैकिंग फ़ील्ड का पर्दाफाश करता है। person.Name = "SWeko" के बाद ऐसा लगता है कि यह ऑब्जेक्ट की स्थिति को बाहरी रूप से बदलता है, जबकि person.SetName("SWeko") केवल ऑब्जेक्ट को बताता है कि इसे इसके राज्य को बदलने की आवश्यकता है। और पूरी तरह से सैद्धांतिक दृष्टिकोण से मुझे लगता है कि उन आपत्तियों में योग्यता है।

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

person.Name = "SWeko"; 
person.Work(); 

, जबकि मुझे लगता है कि दूसरी पंक्ति की उम्मीद कुछ और करेंगे, और शायद वस्तु की आंतरिक स्थिति को प्रभावित करेगा।जब मैं गेटटर और सेटर विधि का उपयोग करता हूं, तो ऐसी कोई विकृति तुरंत स्पष्ट नहीं होती है:

person.SetName("SWeko"); 
person.Work(); 
+0

आईएमएचओ, रीड-राइट गुणों को चर की तरह व्यवहार करना चाहिए। यदि कोई ऑब्जेक्ट कुछ रीड-राइट गुणों को लागू करता है, उन्हें लिखता है और फिर बिना किसी हस्तक्षेप * विधि कॉल के किसी भी क्रम में उन्हें पढ़ता है * उन्हें लिखे गए मानों को वापस पढ़ने का कारण बनना चाहिए। मुझे पठनीय गुणों के साथ कोई समस्या नहीं है, केवल पढ़ने योग्य गुणों के मूल्यों को बदलना, या विधि कॉल के साथ किसी भी या सभी गुणों (केवल पढ़ने या पढ़ने-लिखने) के मूल्यों को बदलना, लेकिन मैं अंतर-जुड़े पढ़ने-लिखने को पढ़ने-लिखना नापसंद करता हूं गुण। आईएमएचओ, स्ट्रिंगबिल्डर जैसे कुछ। लम्बाई केवल पढ़ने-योग्य संपत्ति होनी चाहिए, जो सेटलेथैथ विधि के साथ जोड़ा गया हो। – supercat

+0

@supercat यह यूआई नियंत्रणों के साथ बहुत कठिन काम करेगा, क्योंकि उनके पास बहुत सारे और बहुत सारे गुण होते हैं जो एक-दूसरे पर अपेक्षित और तार्किक तरीके से निर्भर करते हैं (जैसे ऑटोसाइज चौड़ाई और ऊंचाई गुणों को प्रभावित करता है)। – SWeko

+0

@SWeko: एक प्रतिमान जो मुझे लगता है कि फॉर्म के कुछ हिस्सों से गुम है, और जो इसकी उपयोगिता में सुधार करने में मदद करेगा, "वर्तमान व्यवहार" से "सेटिंग्स" गुणों को अलग करना है। उदाहरण के लिए, "दृश्यमान" को "अनुरोधित दृश्यता" और "IsShown" में विभाजित किया जाना चाहिए। "अनुरोधित दृश्यता" एक पठन-लेखन संपत्ति होनी चाहिए जो हमेशा लिखे गए मान को वापस कर देगी; "IsShown" केवल पढ़ने योग्य संपत्ति होनी चाहिए यह दर्शाती है कि नियंत्रण और उसके सभी माता-पिता ने अनुरोध किया है कि दृश्यता सेट है या नहीं। आकार बदलने के लिए, आकार-आकार और वास्तविक आकार के गुणों का अनुरोध किया जाना चाहिए, पूर्व पढ़ने वाले केवल पढ़ने के लिए। – supercat

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