2009-07-02 17 views
5

सी # आप अन्य भाषाओं की तुलना में एक सरल तरीका था गेटर/setters बना सकते हैं में:आप सी # शॉर्टेंड गेटर्स/सेटर्स के दुरुपयोग को कितनी बार देखते हैं?

public int FooBar { get; set; } 

यह सीधे इसे उपयोग करने के लिए एक आंतरिक निजी चर जो आप सीधे समाधान नहीं कर सकते, बाहरी संपत्ति 'FooBar' के साथ बनाता है ।

मेरा सवाल है - आप कितनी बार दुर्व्यवहार देखते हैं? ऐसा लगता है कि इसमें अक्सर encapsulation सर्वोत्तम प्रथाओं का उल्लंघन करने की एक उच्च क्षमता है। मुझे गलत मत समझो, मैं इसे केवल पढ़ने योग्य-लिखने वाले गुणों के लिए उपयुक्त, और आंशिक विविधता के रूप में उपयोग करता हूं, लेकिन आपके कोड आधार में अन्य लेखकों से इसके अप्रिय अनुभव क्या हैं?

स्पष्टीकरण: दुरुपयोग के उद्देश्य से परिभाषा वास्तव में इस तरह के एक संपत्ति को बनाते समय निजी चर उपयुक्त हैं होगा।

+0

कैसे वास्तव में दुर्व्यवहार करने वाले? एकमात्र अपमानजनक चीज जिसे मैं सोच सकता हूं, एक संपत्ति में एक विधि के काम के लायक है, और यह काफी मामूली – annakata

+1

है क्या आप एक उदाहरण दे सकते हैं जहां आपको लगता है कि स्वचालित गुणों का उपयोग उचित नहीं है? –

+1

@annakata - जो आप ** स्वचालित रूप से लागू संपत्ति के साथ ** नहीं कर सकते हैं। –

उत्तर

29

मैंने इसे दुर्व्यवहार देखा है (मेरी राय में)। विशेष रूप से, जब डेवलपर सामान्य रूप से लिखने होगा:

private readonly int foo; 
public int Foo 
{ 
    get 
    { 
     return foo; 
    } 
} 

वे कभी कभी लिखेंगे:

public int Foo { get; private set; } 

हाँ, यह कम है। हां, कक्षा के बाहर से यह वही उपस्थिति है - लेकिन मैं इन्हें एक ही चीज़ के रूप में नहीं देखता, क्योंकि बाद वाला रूप संपत्ति को उसी वर्ग में कहीं और सेट करने की अनुमति देता है। इसका मतलब यह भी है कि अगर संपत्ति कन्स्ट्रक्टर में सेट नहीं है, तो कोई चेतावनी नहीं है, और सीएलआर के लिए क्षेत्र पढ़ा नहीं जाता है। ये सूक्ष्म मतभेद हैं, लेकिन सिर्फ दूसरे रूप के लिए जा रहे हैं क्योंकि यह सरल है और मतभेदों को अनदेखा करना मुझे दुर्व्यवहार की तरह लगता है, भले ही यह नाबालिग हो।

सौभाग्य से, यह अब सी # 6 के रूप में उपलब्ध है:

// Foo can only be set in the constructor, which corresponds to a direct field set 
public int Foo { get; } 
+0

अच्छा बिंदु। स्वचालित गुणों के लिए केवल पढ़ने के लिए भी देखना चाहेंगे – BengtBe

+0

मैंने इसे सामान्य रूप से भी देखा है, लेकिन आपका लेना दिलचस्प है। –

+0

यह लगभग समान नहीं है, क्योंकि आपने स्थानीय परिवर्तनीय foo को केवल पढ़ने के रूप में चिह्नित किया है। यदि यह केवल पढ़ने के लिए है, तो इसे पहले प्रारंभिक रूप में कहीं भी सेट नहीं किया जा सकता है, यदि नहीं, तो इसे उसी वर्ग में कहीं और से एक्सेस किया जा सकता है - जैसे आपके बाद के रूप में। –

3

मैन्युअल रूप से फ़ील्ड को मैन्युअल रूप से लिखने में कोई "दुरुपयोग" नहीं है; और संपत्ति के माध्यम से सभी पहुंच को प्रोत्साहित करना अच्छा है (सीधे क्षेत्र में नहीं) वैसे भी!

सबसे बड़ी समस्या मैं के बारे में पता है binary serialization, जहां यह यह संस्करण असंगत किए बिना वापस एक नियमित रूप से क्षेत्र के लिए बदलने के लिए थोड़ा मुश्किल हो जाता है के साथ - लेकिन फिर ... एक अलग serializer का उपयोग ;-p

यह अच्छा होगा अगर कोई "उचित" रीडोनली संस्करण था, और यदि आपको :this() सीटीओआर-चेनिंग पर स्ट्रक्चर पर उपयोग करने की आवश्यकता नहीं थी, लेकिन .... मेह!

+0

मैं मानता हूँ पी: हा, पूरी तरह सच - आप निजी ऑटो सहारा हो सकता है, यदि आप वास्तव में चाहते हैं ... – Ian

+0

यहां बाउंसिंग निर्देश पॉइंटर का पालन करें (;)): स्वचालित गुण, आप उनके बैकिंग स्टोर्स पर नहीं जा सकते हैं। यदि यह ईमानदारी से है तो इसे * मूल्य * देने का कोई तरीका नहीं है। तो इस प्रकार यह व्यर्थ ... – RCIX

+0

@RCIX होगा: विचार के लिए एक निजी सेट के रूप में यह घोषणा करने के लिए होगा, लेकिन प्रयोग कर एक '[केवल पढ़ने के लिए]' इस का उपयोग बिल्कुल के रूप में सीमित रखना चाहते हैं के लिए मजबूर करने 'readonly' है। –

1

मैंने इसका कोई दुरुपयोग नहीं देखा है। और ईमानदार होने के लिए, मैं वास्तव में नहीं देखता कि आपका क्या मतलब है, क्योंकि मैं नहीं देख सकता कि इस वाक्यविन्यास का दुरुपयोग कैसे किया जा सकता है।

0

मुझे नहीं लगता कि स्वत: गुण कैप्सूलीकरण के संबंध में नियमित रूप से प्रॉपर्टी के अलावा किसी भी बदतर हैं।

आप का मतलब है कि कुछ डेवलपर्स सार्वजनिक स्वत: गुण के बजाय निजी क्षेत्रों का उपयोग तो इस कोर्स गलत और टूट जाता है कैप्सूलीकरण की है ..