2008-11-07 14 views
22

यदि आपके पास ऐसी संपत्ति है जो एक आवृत्ति चर में हो जाती है और सेट करती है तो आम तौर पर आप उस वर्ग के बाहर से उस संपत्ति को एक्सेस करने के लिए हमेशा उपयोग करते हैं।क्या आप एक संपत्ति के माध्यम से एक ही कक्षा के भीतर एक चर का उपयोग करना चाहिए?

मेरा प्रश्न यह है कि आप कक्षा के भीतर हमेशा ऐसा करते हैं? अगर मैं कक्षा में भी हूं, तो मैंने हमेशा संपत्ति का उपयोग किया है, लेकिन इसके लिए कुछ तर्क और सुनना चाहते हैं, जो कि सबसे सही और क्यों है।

या क्या यह परियोजना पर इस्तेमाल होने वाले कोडिंग मानकों का मामला है?

उत्तर

22

गुणों के माध्यम से स्थानीय (वर्ग स्कोप) चरों तक पहुंचने के लिए मजबूत तर्क में से एक यह है कि आप अपनी कक्षा में अमूर्त स्तर का स्तर जोड़ते हैं। यदि आप किसी भी तर्क को बदलते हैं कि यह फ़ील्ड कैसे संग्रहीत किया जाता है, तो आपका शेष कोड अप्रभावित छोड़ा जाएगा।

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

संपत्ति का उपयोग करने से आप संपत्ति के मूल्य पर व्यवसाय नियमों को लागू करने के बजाय प्रत्येक स्थान पर उसी नियम को लागू करने के बजाय सक्षम करते हैं जहां आप सीधे फ़ील्ड तक पहुंच सकते हैं। फिर, कैप्सूलीकरण

स्वत: गुण की शुरूआत के साथ वहाँ भी कम कारण स्पष्ट रूप से एक स्थानीय चर के लिए, जब तक आप प्राप्त पर व्यापार के नियम लागू करने की आवश्यकता/सेट

+2

उस नोट पर, मुझे वास्तव में बैकिंग फ़ील्ड तक सीधे पहुंच को रोकने के लिए भाषा वाक्यविन्यास होना अच्छा लगेगा, भले ही कोई किसी कारण से स्वचालित गुणों का उपयोग न कर सके। स्वचालित गुणों के आगमन के साथ – Alan

+0

+1 –

9

यह इस बात पर निर्भर करता है कि क्या आप संपत्ति सेटटर के भीतर लागू किसी भी तर्क को लागू करना चाहते हैं, और इसलिए आपको वास्तव में मामले के आधार पर किसी मामले पर निर्णय लेना होगा।

जब आप सीधे निजी क्षेत्र में जाते हैं, तो आप जानते हैं कि यह फ़ील्ड ठीक वही है जो आप कहते हैं।

जब आप संपत्ति के माध्यम से जाते हैं, तो मूल्य सेटर तर्क के अनुसार सेट हो जाता है, इसलिए आपको उस क्षेत्र में आवंटित मूल्यों पर कोई भी व्यवसाय नियम या सत्यापन प्राप्त होता है।

या तो 'सही' करने के बारे में एक नियम के साथ आने के लिए बहुत मुश्किल है, केवल एक के बारे में मैं कहूंगा कि मैं यह कहता हूं कि कन्स्ट्रक्टर प्रारंभिकरण में मैं संपत्ति का कभी भी उपयोग नहीं करता।

+0

अच्छा बिंदु हो सकता है। यदि आप संपत्ति में तर्क को बाईपास करना चाहते हैं तो फ़ील्ड का उपयोग करें। – Brannon

0

मुझे लगता है कि यह पूरी तरह से वरीयता है।

class Foo { 
    public string Value { get; set; } 

    public void Write() { 
     Console.Write(Value); 
    } 
} 
+0

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

+0

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

+0

हां, मुझे पता है, मुझे आश्चर्य है कि ऑटो गुण (और हमेशा उनका उपयोग करके) का मतलब है कि जब सेटटर तर्क लागू किया जाता है, तो इसे अनदेखा करने और समस्याओं का कारण होने की अधिक संभावना होती है। एक तकनीकी मुद्दा नहीं, सिर्फ एक सवाल है कि "मुझे मूर्खतापूर्ण गलती करने का क्या कारण हो सकता है?" –

0

आम तौर पर कोडिंग मानकों मैं एक "_" के "एम" पूर्ववर्ती का उपयोग परियोजना के आधार पर:

हालांकि, मैं अपने आप को गुण एक बहुत में अधिक सी # 3.0 ऑटो संपत्ति समर्थन के साथ का उपयोग कर पाते हैं मेरे निजी वर्ग विशेषताओं के लिए नाम। (नीचे की तरह)

private int mVariable; 
private int _Variable; 
चर के सामने उन के साथ

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

+0

_ उन्हें गैर-सीएलएस अनुपालन करता है मेरा मानना ​​है कि – TheCodeJunkie

+0

@ सेल्फिनफ्लिक्टेड सीएलएस अनुपालन केवल सार्वजनिक रूप से दृश्यमान फ़ील्ड/विधियों/ect पर लागू होता है .. भले ही सीएलएस अनुपालन लागू होता है, फिर भी जब आप रिलीज मोड में बनाते हैं तो आंतरिक फ़ील्ड नाम हटा दिए जाते हैं, इसलिए वहां है कोई फर्क नहीं पड़ता कि कोई फर्क नहीं पड़ता। –

0

हाँ मुझे लगता है कि आप में आंतरिक रूप से गुण का उपयोग करना चाहिए अपने कक्षा जब भी संभव हो।गुण अधिक लचीले होते हैं और आपको केंद्रीय मूल्य पर इसके मान को मान्य करने के लिए तर्क जोड़ने की अनुमति देता है।

जब भी आप कन्स्ट्रक्टर (या हर जगह क्षेत्र का उपयोग किया जाता है) में इसे करने के लिए मजबूर होने के बजाय क्षेत्र का प्रारंभ करने में भी देरी कर सकते हैं। उदाहरण:

class Test { 
    private int _checksum = -1; 
    private int Checksum { 
     get { 
     if (_checksum == -1) 
      _checksum = calculateChecksum(); 
     return checksum; 
     } 
    } 
} 
0

हमेशा उपयोग गुण, कारण यहाँ का उपयोग करने के लिए

  1. आसान से कुछ हैं। विजुअल स्टूडियो में आप "प्रो टैब टैब" का उपयोग कर सकते हैं। आप संपत्ति का टुकड़ा मिल जाएगा
  2. गुण भाषा तत्वों, डेटा .नेट फ्रेमवर्क समर्थन गुण में कोड कक्षाओं बाध्यकारी है कि जैसे कि वे डेटा सदस्यों
  3. नेट फ्रेमवर्क वर्गों इसे इस्तेमाल करता हैं पहुँचा रहे हैं,
  4. गुण है विधियों की सभी भाषा विशेषताएं। गुण वर्चुअल
+0

मुझे लगता है कि आप इस प्रश्न को गलत समझते हैं। –

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