2010-08-09 13 views
6
उपयोग करने के लिए

संभव डुप्लिकेट:
C# - When to use properties instead of functionsकब और क्यों सी # एक्सेसर तरीकों

मैं समझने के लिए "ही टिककर खेल 'और' setters"

उपयोग करने के लिए कोशिश कर रहा हूँ कब और क्यों कृपया कोई मार्गदर्शन प्रदान करेगा।

निम्नलिखित संरचनाओं के बीच क्या अंतर है - कृपया केवल एक्सेसर विधियों के संदर्भ में देखें।

//EXAMPLE 1: simple accessor method 
private static bool _isInitialEditMapPageLoad; 
public static bool isInitialEditMapPageLoad 
{ 
    get {return _isInitialEditMapPageLoad;} 
    set {_isInitialEditMapPageLoad = value;} 
} 

//EXAMPLE 2: accessor method with a conditional test 
private static bool _isInitialEditMapPageLoad; 
public static bool isInitialEditMapPageLoad 
{ 
    get 
    { 
     if (currentSession[isAuthorizedUseder] == null) 
      return false; 
     else 
      return _isInitialEditMapPageLoad;  
    } 
    set {isInitialEditMapPageLoad = value;} 
} 


//EXAMPLE 3: just a get accessor method - is this the same as EXAMPLE 4? 
private static bool _isInitialEditMapPageLoad = false; 
public static bool isInitialEditMapPageLoad 
{ 
    get {return _isInitialEditMapPageLoad;} 
} 


//EXAMPLE 4: simple method 
private static bool _isInitialEditMapPageLoad = false; 
public static bool isInitialEditMapPageLoad 
{ 
    return _isInitialEditMapPageLoad;  
} 
+6

उदाहरण 2 आपके पास एक स्टैक ओवरफ्लो त्रुटि है;) और उदाहरण 4 गलत है – Gregoire

+0

संभावित डुप्लिकेट [सी # - कार्यों के बजाय गुणों का उपयोग कब करें] (http://stackoverflow.com/questions/1374273/c-when-to -उज-गुण-बदले में-फ़ंक्शंस), कई लोगों के बीच। – Rob

+0

उसे नहीं देखा .. अच्छा पकड़ो। – David

उत्तर

3

1: यह एक साधारण संपत्ति है, और इसका उपयोग सार्वजनिक क्षेत्र के समान ही किया जा सकता है। यदि आपके पास get और set अन्य उपयोगकर्ताओं (यानी, अन्य कक्षाओं) के संचालन का खुलासा करने का कोई कारण है और आपको कुछ भी कल्पना की आवश्यकता नहीं है, तो यह है। यह भी साथ "स्वत: गुण" लिखा जा सकता है,

public static bool isInitialEditMapPageLoad {get;set;} // behaves just like example 1 

ऑटो रंगमंच की सामग्री ज्यादा लिखने के लिए तेजी से कर रहे हैं और मेरी राय में बहुत पूर्ण घोषणा की तुलना में अधिक पढ़े जाने योग्य हैं (अगर मैं एक समर्थन क्षेत्र के साथ एक पूर्ण घोषणा को देखते हैं, मुझे कुछ जटिलता मिलती है)।

2: यह गुणों के कारणों में से एक दिखाता है: कुछ तर्क का उपयोग करके मूल्य को वापस करने के बजाय हमेशा मूल्य वापस करने के लिए। कोई भी इस मूल्य को सेट कर सकता है क्योंकि जब भी वे चाहते हैं तो सार्वजनिक क्षेत्र होगा। वे जब भी चाहें मूल्य प्राप्त कर सकते हैं, साथ ही, false चेतावनी के साथ या तो यह प्रारंभिक लोड नहीं है या उपयोगकर्ता अधिकृत नहीं है - यानी, कुछ (सरल) तर्क मूल्य लौटने से पहले किया जाता है।

3: यह केवल पढ़ने के लिए सार्वजनिक क्षेत्र के रूप में व्यवहार करता है - कोई भी मूल्य पुनर्प्राप्त कर सकता है, लेकिन इसे सेट नहीं कर सकता है। यह संक्षेप में एक मान है जो केवल बाहरी कोड को पढ़ा जाता है (readonly कीवर्ड से भ्रमित नहीं होना चाहिए)

4: मेरे लिए संकलन त्रुटि में परिणाम हुआ। यह मानते हुए कि एक विधि घोषणा माना जाता है, मैन्युअल रूप से एक गेटर को परिभाषित करना जैसे कि जावा में किया जाएगा, तो यह उदाहरण 3 के समान है।मेरा मानना ​​है कि ऐसे अन्य मुद्दे हैं जो इसे समान नहीं बनाते हैं, जैसे कि आप इसे निर्भरता संपत्ति में बदलना चाहते हैं, दुर्भाग्यवश उस क्षेत्र में मेरा ज्ञान कम हो गया है।

==========

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

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

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

8

आपके गेटर्स/सेटर्स आपकी कक्षा में आपका सार्वजनिक इंटरफ़ेस होना चाहिए।

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

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

class Person { 
    int age = 0; 

    public int Age { 
    get { return age; } 
    set { 
     //do validation 
     if (valid) { 
     age = value; 
     } 
     //Error conditions if you want them. 
    } 
    } 

    //More getters/setters 
} 
5

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

जब तक आपको किसी प्रकार की सत्यापन या आलसी-लोड गुणों की आवश्यकता न हो तो आप आमतौर पर ऑटो गुणों का उपयोग कर सकते हैं।

public string Name { get; set; } 
2

अन्य लोगों की तरह, गेटर्स/सेटर्स का उपयोग करें जब आप ऑब्जेक्ट सदस्यों को अन्य ऑब्जेक्ट्स पर उपलब्ध होना चाहते हैं।

इसके अतिरिक्त, ऑटोप्रोपर्टीज का उपयोग करते हुए योरो कोड की पठनीयता में सुधार किया जा सकता है (यदि आप .NET 2.0 या अधिक पर हैं)। उदाहरण आप तो इस तरह होगा:

// example 1 
public static bool IsInitialEditMapPageLoad { get; set; } 

// example 3/4 - note that false is the default for bools 
public static bool IsInitialEditMapPageLoad { get; private set; } 

उदाहरण 3 संभावना मान्यता तर्क वहाँ न होने के कारण एक ही रहना होता था।

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