2010-07-16 12 views
10

मैं .NET 2.0 का उपयोग कर रहा हूं इसलिए स्वचालित गुणों तक पहुंच नहीं है। तो मैं निजी चर और सार्वजनिक संपत्तियोंनिजी सदस्य चर के लिए उपयोग अवरुद्ध? सार्वजनिक संपत्तियों का उपयोग बल?

private string m_hello = null; 

public string Hello 
{ 
    get{return m_hello;} 
    set{m_hello = value;} 
} 

ऊपर निजी/सार्वजनिक सदस्यों में से युक्त वर्ग के तरीकों के लिए कोडिंग के निम्नलिखित तरीके का सहारा चाहिए, वहाँ वैसे भी निजी चर तक पहुँच सीमित है? मुझे यह पसंद नहीं है कि मैं या तो m_hello या हैलो का उपयोग कर सकता हूं।

धन्यवाद।

+10

ध्यान देने योग्य एक बात - भले ही आप .NET 2.0 को लक्षित कर रहे हों, यदि आप ऐसा करने के लिए C# 3 का उपयोग कर रहे हैं, तो भी आप स्वचालित गुणों का उपयोग कर सकते हैं। उन्हें किसी भी ढांचे के समर्थन की आवश्यकता नहीं है। –

+0

@ जोन - यह शायद टिप्पणी के बजाय उत्तर देने के लिए पर्याप्त जानकारी है। – tvanfosson

+0

@tvanfosson - मैं सहमत हूं, इसके बारे में कोई जानकारी नहीं थी! – adamwtiko

उत्तर

5

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

मुझे नहीं लगता कि आपको यह क्यों करना होगा/ऐसा करना चाहते हैं, क्योंकि यह आपकी आंतरिक कक्षा है, इसलिए आप कोड के नियंत्रण में हैं और आप परिभाषित कर सकते हैं कि इसका उपयोग कैसे किया जाता है, इसलिए वहां एक मुद्दा नहीं होना चाहिए।

+0

वाह! क्षमा करें @ मिथेल - मैंने गलती से गलत पोस्ट संपादित किया। उसके लिए क्षमा चाहता हूँ। –

+0

@Marc - क्या आपको सुंदर यादृच्छिक क्रम सुविधा से थोड़ा सा फायदा हुआ? मैंने यह एक बार से अधिक बार किया है जहां मैंने स्वचालित रूप से माना था कि मेरा प्रश्न एक संपादन (या सबमिशन) के बाद एक ही स्थिति में था और संपादन बटन पर अंधाधुंध क्लिक किया। उस स्थिति में उत्तर वस्तुतः एक ही पाठ के साथ शुरू होने पर मदद नहीं करता है। लूप के शरीर के अंदर – tvanfosson

2

नहीं, मूल रूप से। खैर, आप [Obsolete] और #pragma के माध्यम से कंपाइलर चेतावनियों के साथ कुछ कर सकते हैं, लेकिन यह अत्यधिक होगा।

आप शायद टूलींग के साथ यह कर सकता है, लेकिन अंततः तुम मूर्ख काम करने के लिए नहीं लोगों पर विश्वास करने की जरूरत है। आखिरकार, क्या आपके पास विशेष नियम हैं:

while(true) { } 

या क्या आप इसे "बेवकूफ मत बनो" पर डाल देते हैं? ; पी

+1

'जबकि (सत्य)' प्लस 'ब्रेक' एक पूरी तरह से वैध प्रोग्रामिंग निर्माण है। उससे भी बदतर चीजें हैं। –

+1

@ToxicAvenger - लेकिन * बिना * ब्रेक'? –

4

नहीं। कक्षा के अंदर किसी भी विधि के पास दोनों तक पहुंच होगी।

आपकी टीम को मानक (निजी या निजी चर) का उपयोग करने के लिए मानकीकृत करना चाहिए।

एक बार जब आप निर्णय लेते हैं कि आप किस प्रकार उपयोग करना चाहते हैं, तो आप मानक लागू करने के लिए कस्टम FxCop नियम का उपयोग करने का प्रयास कर सकते हैं।

1

आपको केवल सार्वजनिक हैलो संपत्ति के माध्यम से संपत्ति का उपयोग करना चाहिए। इस पैटर्न के लिए यही कारण है। यदि आप प्राप्त या सेट करने के लिए कोई कार्यक्षमता जोड़ते हैं, यदि आप निजी उदाहरण तक पहुंच रहे हैं, तो आप अपने कोड में बग पेश करेंगे। लेकिन एवर नहीं है, आप किसी को निजी कॉल करने से नहीं रोक सकते हैं जब वे आपकी कक्षा में आपके कोड को बदलते हैं।

+0

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

+0

मैं स्थिरता पसंद करता हूं और सिर्फ पैटर्न के कारण को इंगित करना चाहता था। हर एक समाधान के लिए हमेशा एक कारण है, यह सबसे अच्छा अभ्यास नहीं करता है। – CkH

1

व्यक्तिगत रूप से, मुझे कक्षा के भीतर निजी सदस्य तक पहुंचने में कुछ भी गलत नहीं लगता है। असल में मैं आमतौर पर ऐसा करता हूं (जब तक संपत्ति गेटटर/सेटर में तर्क नहीं होता है जिसे मैं हमेशा लाभ उठाना चाहता हूं)।

यह सिर्फ मुझे समझ में आता है: कक्षा के भीतर कोड उस वर्ग के कार्यान्वयन का गठन करता है; खुद से एक कार्यान्वयन क्यों छुपाएं?

मेरा मतलब यह है कि मेरा क्या मतलब है। मान लीजिए मैं कुछ सदस्य, m_denominator है, और मैं इसे शून्य होने के लिए कभी नहीं चाहते:

private int m_denominator = 1; 
public int Denominator 
{ 
    get { return m_denominator; } 
    set 
    { 
     if (value == 0) 
      throw new ArgumentException("Denominator must not be zero."); 
     m_denominator = value; 
    } 
} 

मैं अपने आप से कह सकते हैं: "ठीक है, हर जगह मैं इस वर्ग के भीतर यह मान, मुझे यकीन है कि बनाने के लिए Denominator का उपयोग करना चाहिए सेट मैं मैं इसे शून्य पर सेट नहीं कर रहा हूं। " लेकिन मैं पूरी तरह से नियंत्रण में हूं कि मैं Denominator पर सेट कर रहा हूं - मैं कक्षा के अंदर हूं!में परिदृश्य, Denominator संपत्ति में तर्क का बिंदु क्लाइंट कोड द्वारा निर्धारित अमान्य मानों से कक्षा को सुरक्षित करना है। कक्षा के कार्यान्वयन के भीतर अपने आंतरिक राज्य को कुछ अमान्य मूल्य पर सेट करने का कोई बहाना नहीं है।

बेशक यह एक पूर्ण नियम नहीं है। निश्चित रूप से ऐसे समय होते हैं जब किसी वर्ग के भीतर अपने तर्क के लिए संपत्ति का उपयोग सुरक्षात्मक उपाय के रूप में एक समझदार विकल्प हो सकता है; वास्तव में, मैं सिर्फ बहस कर रहा हूं कि किसी वर्ग के भीतर से निजी सदस्यों तक पहुंचने के लिए गलत नहीं है।

+2

तो क्या होता है जब आप संपत्ति सेटटर में महत्वपूर्ण तर्क जोड़ने के लिए 6 महीने में कोड पर वापस आते हैं? आपके सभी वर्ग का आंतरिक कोड अब नए कार्यान्वयन को छोड़ देगा। –

+3

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

+2

@ डीआर हर्बी: लेकिन मेरे अनुभव में यह संभावना है कि आप संपत्ति में तर्क जोड़ देंगे लेकिन * नहीं चाहते कि कक्षा के भीतर होने वाली प्रत्येक पहुंच पर उस तर्क को निष्पादित किया जाए - केवल बाहरी कोड से पहुंच पर। मैंने निश्चित रूप से उन डेवलपर्स के साथ काम किया है जिन्होंने अपनी संपत्तियों में तर्क जोड़ा और अचानक उन्हें पता चला कि उनके कुछ कोड को उनके इरादे से अधिक बार निष्पादित किया जा रहा था। यह एक निर्णय कॉल है, जाहिर है; मैं बस यह इंगित कर रहा हूं कि बाहरी दुनिया से आपके कार्यान्वयन को छिपाने और इसे ... से छिपाने के बीच एक अंतर है। –

6

आप विरासत के माध्यम से ऐसा कर सकते हैं:

abstract class A // A is not instantiatable due to being abstract 
{ 
    private string m_hello = null; 

    public string Hello 
    { 
     get{return m_hello;} 
     set{m_hello = value;} 
    } 
} 

class B : A 
{ 
    // B now cannot access the private variable, use B in your code instead of A 
} 
+3

हां, लेकिन ... यक। – tvanfosson

+3

मैंने कभी दावा नहीं किया कि यह अच्छा था। बस यह किया जा सकता है। –

1

आप पाते हैं अपने आप को अपने आप से विवरणों को छिपाना चाहते हैं, तो यह है कि आपके वर्ग भी कई जिम्मेदारियां एक कोड गंध हो सकता है। एक नई कक्षा में जिम्मेदारियों में से एक निकालने पर विचार करें।

+0

कभी-कभी यह "स्वयं" नहीं होता है लेकिन आपकी टीम के अन्य सदस्य भी हैं जो नियमों का पालन नहीं कर सके। मुझे पता है, सिद्धांत रूप में सब कुछ एक साधारण समाधान है लेकिन जीवन कठिन है ... – bpiec

+0

@ जोहेइट: यह एक दिलचस्प दृष्टिकोण है। हालांकि कक्षाओं को एक स्तर तक विभाजित करना जहां प्रत्येक व्यक्ति की लगभग छोटी ज़िम्मेदारी सिद्धांत में अच्छी लगती है, लेकिन व्यवहार में अपने अधिकार में समझने के लिए एक दुःस्वप्न हो सकता है। – oliver

8

के रूप में अन्य लोगों को इस एक जवाब होना चाहिए का सुझाव दिया है ...

तुम अब भी # 3 जब quite a few other C# 3 features के साथ .NET 2.0, को लक्षित सी में स्वत: गुणों का उपयोग कर सकते हैं। अभिव्यक्ति पेड़ों के विपरीत (कहें) स्वचालित गुणों को सीएलआर या ढांचे से विशेष कुछ भी नहीं चाहिए, [CompilerGenerated] विशेषता (जिसे .NET 2.0 में पेश किया गया था) से परे।

तो यदि आप वीएस -2008 या वीएस -2010 का उपयोग कर रहे हैं, तो यह एक स्वचालित संपत्ति का उपयोग करने लायक होगा।

हालांकि इसके लायक होने के लिए, मुझे यह क्षमता भी चाहिए। मैं किसी प्रॉपर्टी के दायरे चर करने में सक्षम होना चाहते हैं:

public string Name 
{ 
    private string name; 
    get { return name; } 
    set { name = value; } 
} 

मैं केवल पढ़ने के लिए एक निजी चर बनाने की तरह एक सा यह देखने - यह ग्राहकों को कोई फर्क नहीं पड़ता है, लेकिन यह वर्ग कोड के भीतर शुद्धता को लागू करने में मदद करता है अपने आप।

+2

+1 - मैं पूरी तरह से निजी रूप से स्कॉप्ड संपत्ति चर के साथ सहमत हूं। मुझे वास्तव में संपत्ति विधियों में मनमानी कोड दोनों की क्षमता चाहिए और ** केवल संपत्ति के लिए बैकिंग फ़ील्ड तक पहुंच सीमित करें ताकि मैं गलती से गेटटर/सेटर कोड में "नियम" से बच न सकूं। – tvanfosson

+1

टेंगेंशियल से संबंधित, मैं अपरिवर्तनीय स्वचालित गुणों के साथ-साथ (कन्स्ट्रक्टर या प्रारंभकर्ता सिंटैक्स के माध्यम से सेटटेबल) और फिर वहां से केवल gettable प्राप्त करना चाहता हूं। कंपाइलर द्वारा उत्पन्न 'readonly' फ़ील्ड द्वारा समर्थित। –

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