2011-09-27 9 views
9

मैं एक सीएलएस-अनुरूप प्रकार पुस्तकालय विकसित कर रहा हूं और मेरे पास इसके अंदर एक कक्षा है, जिसमें निजी, संरक्षित और सार्वजनिक क्षेत्र और गुण शामिल हैं। मैं अंडरस्कोर प्रतीक (_) का उपयोग निजी या संरक्षित क्षेत्रों के लिए उपसर्ग के रूप में करता हूं और समान नाम वाले गुणों से अलग करने के लिए थोड़ा पहला अक्षर। यह इतना दिखता है:संरक्षित क्षेत्रों के लिए सही सीएलएस-अनुरूप नामकरण सम्मेलन क्या है?

class SomeClass 
{ 
protected int _age; //Here is NOT CLS-compliant (because of _ can't be the first symbol of identifier) 

public int Age { get { return this._get; } } 
} 

तो मैं इस तरह से करने की कोशिश की:

class SomeClass 
{ 
protected int age; //Here is NOT CLS-compliant (because of age and Age differ only in one symbol) 

public int Age { get { return this._get; } } 
} 

कृपया

class SomeClass 
{ 
private int _age; //Here is OK 

public int Age { get { return this._get; } } 
} 

लेकिन जब मैं संरक्षित क्षेत्रों मैं एक अगली समस्या के साथ भिड़ना उपयोग करने का प्रयास , मुझे बताएं, ऐसे मामलों के लिए डेवलपर्स के बीच सीएलएस-अनुपालन नोटेशन या सम्मेलन क्या सही है? क्या मैं c_ style में prefixes का उपयोग l_age की तरह करता हूं?

उत्तर

10

यहाँ एक अधिक सही संस्करण है, IMO:

private int _age; 
public int Age { 
    get { return this._age ; } 
    protected set { this._age = value; } 
} 

या बस:

public int Age { get; protected set; } 

आप ठीक ढंग से यह संपुटित है, तो यह कोई फर्क नहीं पड़ता क्या क्षेत्र कहा जाता है, के रूप में उस प्रकार के बाहर कुछ भी नहीं देख सकता है।


टिप्पणियों में, घटनाओं का सवाल तो उदाहरण के साथ उठाया है,:

protected EventHandler<StateChangedEventArgs> _stateChanged; 
public event EventHandler<StateChangedEventArgs> StateChanged 
{ 
    add { lock (this.StateChanged) { this._stateChanged += value; } } 
    remove { lock (this.StateChanged) { this._stateChanged -= value; } } 
} 

यहाँ मैं फिर से जोर है कि वहाँ के लिए इस क्षेत्र को संरक्षित करने की कोई कारण; घटना व्युत्पन्न कक्षा में से संबंधित नहीं है। यह यह करना चाहते कर सकते हैं 2 समझदार कार्य किया है:

  1. घटना
  2. सदस्यता के आह्वान/घटना

पूर्व On* पैटर्न के माध्यम से किया जाना चाहिए करने के लिए सदस्यता समाप्त; उत्तरार्द्ध को नियमित एक्सेसर्स का उपयोग करना चाहिए (अन्यथा यह ताला का उल्लंघन करता है)। इसके अलावा, भी अगर हम मान लेते हैं कि lock(this.StateChanged) कोई गलती है (है कि एक सच में, सच बुरी बात ताला वस्तु -यह सभी पर कार्य नहीं करेगा के रूप में उपयोग करने के लिए किया जाएगा), में ध्यान दें कि सी # 4.0 संकलक है जब आप "फ़ील्ड-जैसे" ईवेंट लिखते हैं (यानी कोई स्पष्ट add/remove) लिखते हैं तो एक अधिक कुशल लॉक रणनीति इनबिल्ट (Monitor) का उपयोग करती है। नतीजतन, यहां पसंदीदा दृष्टिकोण होगा:

public event EventHandler<StateChangedEventArgs> StateChanged; 
protected virtual void OnStateChanged(StateChangedEventArgs args) { 
    var snapshot = StateChanged; // avoid thread-race condition 
    if(snapshot != null) shapshot(this, args); 
} 

और ... यह है!

  • अगर उपवर्ग की सदस्यता लेने/सदस्यता समाप्त करना चाहता है (आदर्श नहीं है, लेकिन हुंह) यह सिर्फ StateChanged += और StateChanged -=
  • अगर उपवर्ग घटना आह्वान करने के लिए, यह कहता है OnStateChanged(...)
  • अगर उपवर्ग करना चाहता का उपयोग करता है घटना तर्क tweak, यह एक override

के लिए किसी भी गैर-निजी क्षेत्रों के लिए कोई जरूरत नहीं कहते हैं।

+0

एमएमएम ... घटनाओं के साथ क्या करना है? – Vasya

+0

@ प्रेटोर 12 * * घटनाओं के बारे में क्या? व्युत्पन्न वर्ग को वहां के क्षेत्र में पहुंच की आवश्यकता क्या है? शायद एक विशिष्ट घटना से संबंधित उदाहरण जोड़ें? –

+0

हां यह है। बेस-क्लास में एक ईवेंट होता है, जिसे व्युत्पन्न-वर्ग विधियों द्वारा बुलाया जाता है। इस तरह के तंत्र के लिए मैंने ऐसा किया: संरक्षित EventHandler _stateChanged; सार्वजनिक कार्यक्रम EventHandler StateChanged; { जोड़ें {लॉक (this.StateChanged) {this._stateChanged + = value; }} हटाएं {लॉक (this.StateChanged) {this._stateChanged - = value; }} } – Vasya

2

मार्क के जवाब बैकअप लेने के लिए Field Design Microsoft से पर मार्गदर्शन राज्यों:

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

यह शायद यही कारण है कि आप उन्हें नामकरण पर किसी भी उपयोगी मार्गदर्शन (वास्तव में, naming guidelines बस वापस फील्ड डिजाइन पेज बिंदु पर) नहीं मिलेगा है।

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