अंडरस्कोर करना या अंडरस्कोर न करना, यही सवाल है


130

क्या निजी क्षेत्रों को C # में एक अंडरस्कोर के साथ प्रीफ़िक्सिंग नहीं करने से कोई समस्या है, यदि बाइनरी संस्करण को किसी भी फ्रेमवर्क भाषाओं द्वारा उपभोग किया जा रहा है? उदाहरण के लिए चूंकि C # केस-संवेदी है, आप किसी फ़ील्ड को "फू" और सार्वजनिक संपत्ति "फू" कह सकते हैं और यह ठीक काम करती है।

क्या यह केस-असंवेदनशील भाषा जैसे कि VB.NET पर कोई प्रभाव पड़ेगा, क्या कोई CLS- अनुपालन (या अन्य) समस्याओं से होगा यदि नाम केवल आवरण से अलग हैं?


18
अंडरस्कोर उपसर्ग का बिंदु, बीटीडब्ल्यू, मामले के मुद्दों से निपटने के लिए नहीं है। यह कोड पढ़ते समय फ़ील्ड और स्थानीय लोगों को आसानी से और नेत्रहीन रूप से बताने में सक्षम है। मैं इसे C # और VB एक जैसे उपयोग करूँगा।
नील हेविट

2
@ नीलहाइट: ठीक है, यह फ़ंक्शन मापदंडों को सदस्य चर के साथ विरोधाभासी होने से भी रोकता है, जिसके लिए उनमें से हर एक को तैयार करने की आवश्यकता होती है this, जो बेकार है। संपादित करें: मैंने अभी चार साल पुरानी टिप्पणी पर प्रतिक्रिया दी ...
एड एस।

बस स्पष्टता के लिए सरकारी मानक है _camelCase(केवल पढ़ने के इष्ट) github.com/dotnet/corefx/blob/master/Documentation/...
क्रिस Marisic

मैं निजी बैकिंग स्टोर के लिए _camelCase पसंद करता हूं। यानी: निजी दायर जो एक संपत्ति के माध्यम से सौंपे गए डेटा तक पहुंच रखता है। मुझे ऑटो गुण पसंद नहीं है क्योंकि उन्हें वर्ग परिभाषा में एक ज्ञात मूल्य के लिए आरंभीकृत नहीं किया जा सकता है, और यदि मुझे सेटर में साइड इफेक्ट चाहिए, तो मुझे स्पष्ट रूप से घोषित बैकिंग स्टोर की आवश्यकता है। दुर्भाग्यवश, जब मैं c # संपादक में ^ R ^ E का उपयोग करता हूं, तो इसे हटा दिया जाता है, इसलिए मुझे इसे हर बार ... में वापस जोड़ना होगा।
टॉमएक्सपी 411

जवाबों:


46

इसका कोई असर नहीं होगा ।

सीएलएस-अनुरूप पुस्तकालयों को लिखने के लिए सिफारिशों का हिस्सा दो सार्वजनिक / संरक्षित संस्थाएं नहीं हैं जो केवल मामले से भिन्न हैं जैसे कि उनके पास नहीं होना चाहिए

public void foo() {...}

तथा

public void Foo() {...}

जो आप वर्णन कर रहे हैं वह समस्या नहीं है क्योंकि निजी वस्तु पुस्तकालय के उपयोगकर्ता के लिए उपलब्ध नहीं है


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

2
पुनश्च व्यक्तिगत रूप से, मैं सी # में अंडरस्कोर नहीं करता हूं। मेरे लिए यह व्यक्तिगत प्राथमिकता है, धार्मिक विश्वास नहीं
बाइनरी वॉरियर

1
मैंने दोनों तरह से किया है और मैं अपना मन बनाना चाहता हूं, एक और सभी के लिए, ज्ञान के आधार पर: पी
TheCodeJunkie

46
मैं अंडरस्कोर का उपयोग कर रहा हूं। उन्हें तर्क और स्थानीय चर से अलग करना आसान है।
रिनैट अब्दुलिन

4
मैं केवल निजी क्षेत्रों के लिए _ का उपयोग करता हूं, हालांकि 3.5 ऑटो संपत्ति के कारण मेरे पास लगभग निजी क्षेत्र नहीं हैं। आम तौर पर मेरे पास केवल एक निजी क्षेत्र होता है यदि मैं गैर-आदिम प्रकारों पर आलसी लोडिंग को लागू करता हूं।
क्रिस मैरिसिक

278

महत्वपूर्ण अद्यतन (12 अप्रैल, 2016):

यह हमारे ध्यान में लाया गया था कि .NET CoreFX टीम का आंतरिक मानक अंडरस्कोर-नोटेशन का उपयोग करने पर जोर देता है, बिना किसी अंतर्दृष्टि के क्यों। हालाँकि अगर हम नियम # 3 को करीब से देखते हैं तो यह स्पष्ट हो जाता है कि वहाँ , उपसर्गों की एक प्रणाली है _, जो बताती है कि पहले स्थान पर क्यों चुना गया था।t_s__

  1. हम _camelCaseआंतरिक और निजी क्षेत्रों के लिए उपयोग करते हैं और जहां संभव हो, आसानी से उपयोग करते हैं। उपसर्ग उदाहरण क्षेत्रों के साथ _, स्थिर क्षेत्रों के साथ s_और थ्रेड स्थिर क्षेत्रों के साथ t_। जब स्थिर क्षेत्रों पर उपयोग किया जाता है, तो (यानी नहीं ) के readonlyबाद आना चाहिए ।staticstatic readonlyreadonly static
  2. this.जब तक बिल्कुल जरूरी न हो हम टालते हैं ।

इसलिए यदि आप कुछ प्रदर्शन क्रिटिकल, मल्टीथ्रेडेड, सिस्टम लेवल कोड पर काम करने वाली .NET CoreFX टीम की तरह हैं , तो यह स्ट्रगल है कि आप:

  • उनके कोडिंग मानकों का पालन करें और
  • अंडरस्कोर-नोटेशन का उपयोग करें और
  • इस उत्तर को आगे न पढ़ें

अन्यथा कृपया पर पढ़ें ...

मूल ANSWER:

आइए पहले इस बात पर सहमत हों कि हम किस बारे में बात कर रहे हैं। सवाल यह है कि अगर हम दृश्यता संशोधक ऐसा करने की अनुमति देते हैं तो हम गैर-स्टैटिक विधियों और किसी वर्ग / उप-वर्ग के रचनाकारों के सदस्यों से कैसे पहुँच सकते हैं।

अंडरस्कोर-अंकन

  • सुझाव देता है कि आप निजी क्षेत्रों के नामों में "_" उपसर्ग का उपयोग करते हैं
  • यह भी कहता है कि आपको "यह" कभी भी उपयोग नहीं करना चाहिए जब तक कि यह बिल्कुल आवश्यक न हो

इस संकेतन का

  • सुझाव है कि आप हमेशा "यह" का उपयोग करें। किसी भी उदाहरण के सदस्य का उपयोग करने के लिए

यह संकेतन क्यों मौजूद है?

क्योंकि यह आप कैसे हैं

  • जब वे एक ही नाम साझा करते हैं, तो एक क्षेत्र से एक पैरामीटर के अलावा बताएं
  • सुनिश्चित करें कि आप वर्तमान उदाहरण के संदर्भ में काम कर रहे हैं

उदाहरण

public class Demo
{
   private String name;
   public Demo(String name) {
       this.name = name;
   }
}

अंडरस्कोर-नोटेशन क्यों मौजूद है?

कुछ लोगों को "यह" लिखना पसंद नहीं है, लेकिन उन्हें अभी भी एक क्षेत्र और एक पैरामीटर को अलग करने का एक तरीका चाहिए, इसलिए वे एक क्षेत्र के सामने "_" का उपयोग करने के लिए सहमत हुए।

उदाहरण

public class Demo
{
   private String _name;
   public Demo(String name) {
      _name = name;
   }
}

कोई सोच सकता है कि यह सिर्फ व्यक्तिगत स्वाद की बात है और दोनों तरीके समान रूप से अच्छे / बुरे हैं। हालाँकि कुछ ऐसे पहलू हैं जहाँ यह अंकन अंडरस्कोर-नोटेशन को धड़कता है:

स्पष्टता

  • अंडरस्कोर-नोटेशन क्लूटर्स नाम
  • यह अंकन नामों को बरकरार रखता है

संज्ञानाात्मक भार

  • अंडरस्कोर-नोटेशन असंगत है, यह आपको फ़ील्ड को एक विशेष तरीके से व्यवहार करता है, लेकिन आप इसका उपयोग अन्य सदस्यों के साथ नहीं कर सकते हैं, हर बार जब आपको खुद से यह पूछने की ज़रूरत होती है कि आपको एक संपत्ति या फ़ील्ड की आवश्यकता है या नहीं?

  • यह-संकेतन सुसंगत है, आपको सोचने की ज़रूरत नहीं है, आप किसी भी सदस्य को संदर्भित करने के लिए हमेशा "इस" का उपयोग करते हैं

अद्यतन: जैसा कि बताया गया था कि निम्नलिखित एक फायदा नहीं है

रखरखाव

  • अंडरस्कोर-नोटेशन की आवश्यकता है कि आप _रिफ्लेक्टिंग करते समय नज़र रखें , एक फ़ील्ड को संपत्ति में बदल दें (निकालें _) या इसके विपरीत ( _)

  • इस नोटेशन में ऐसी कोई समस्या नहीं है

स्वत: पूर्णता

जब आपको उदाहरण के सदस्यों की सूची देखने की आवश्यकता होती है:

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

अस्पष्टता

कभी-कभी आपको Intellisense की मदद के बिना कोड से निपटना पड़ता है। उदाहरण के लिए जब आप कोड की समीक्षा करते हैं या स्रोत कोड को ऑनलाइन ब्राउज़ करते हैं।

  • अंडरस्कोर-संकेतन अस्पष्ट है: जब आप कुछ देखते हैं। पहले से बताएं कि क्या आप नहीं बता सकते हैं कि कुछ एक वर्ग है और कुछ कुछ इसकी स्थिर संपत्ति है ... या शायद कुछ एक मौजूदा उदाहरण संपत्ति है, जिसके पास SomeElse की अपनी संपत्ति है

  • यह-संकेतन स्पष्ट है: जब आप कुछ देखते हैं। केवल एक स्थिर संपत्ति के साथ एक वर्ग का मतलब कर सकते हैं और जब आप इसे देखते हैं। तो आप किसी भी सदस्य के बारे में कुछ जानते हैं।

एक्सटेंशन के तरीके

आप "यह" का उपयोग किए बिना उदाहरण पर एक्सटेंशन विधियों का उपयोग नहीं कर सकते।

  • अंडरस्कोर-नोटेशन के लिए आवश्यक है कि आप "इस" का उपयोग न करें, हालांकि आपके पास जो विस्तार विधियां हैं
  • यह-संकेतन आपको हिचकिचाहट से बचाता है, आप हमेशा "यह", अवधि का उपयोग करते हैं।

विजुअल स्टूडियो सपोर्ट

  • अंडरस्कोर-नोटेशन में विजुअल स्टूडियो में बिल्ट-इन सपोर्ट नहीं है
  • यह अंकन प्राकृतिक रूप से विज़ुअल स्टूडियो द्वारा समर्थित है:

    1. "यह।" योग्यता : गैर-स्टैटिक क्षेत्रों में उपयोग किए जाने वाले सभी गैर-स्थैतिक क्षेत्रों this.को C # में पूर्वनिर्मित किया जाना पसंद करते हैं

आधिकारिक सिफारिशें

बहुत सारे आधिकारिक दिशानिर्देश जो स्पष्ट रूप से कहते हैं "विशेष रूप से सी # में अंडरस्कोर का उपयोग न करें"


22
यह एक अद्भुत उत्तर है। इस सारी जानकारी को संकलित करने के लिए समय निकालने के लिए धन्यवाद।
बाघिन

5
C ++ से नहीं आता है, क्योंकि C ++ में पहचानकर्ता भाषा और मानक पुस्तकालय usages के लिए एक अंडरस्कोर के साथ शुरुआत करते हैं।
रोब जी

7
आप प्रदर्शन महत्वपूर्ण, बहु-स्तरीय, सिस्टम स्तर कोड और अन्य कोड के बीच अंतर क्यों करते हैं? _camelCaseयदि मेरा कोड प्रदर्शन महत्वपूर्ण / सिस्टम स्तर कोड है तो मेरी मदद करने के लिए कैसे उपयोग किया जा रहा है?
बोर्नटोडकोड

6
अंडरस्कोर का उपयोग प्रदर्शन लेखन महत्वपूर्ण, बहु-थ्रेडेड या सिस्टम-स्तरीय कोड के साथ कुछ भी नहीं है। यह मायने रखता है कि क्या मायने रखती है और CoreFX टीम सिर्फ एक टीम है जो एक विशिष्ट सम्मेलन पर सहमत है। यह एक महान जवाब है, नामकरण सम्मेलनों की तुलना करने वाले एक बहुत अच्छे विश्लेषण के साथ समर्थित है, लेकिन मेरा मानना ​​है कि जोड़ा गया भाग कह रहा है कि "अंडरस्कोर बेहतर हैं क्योंकि CoreFX टीम का कहना है कि" वास्तव में इसकी गुणवत्ता कम है।
फाक गुर

5
मेरी समस्या यह है कि मैं तार्किक निष्कर्ष को समझता हूं। en.wikipedia.org/wiki/Inference लेकिन हे, मुझे लगता है कि यह हर किसी के लिए नहीं है।
user603563

67

Microsoft StyleCop सहायता फ़ाइल से लिया गया:

TypeName: FieldNamesMustNotBeginWithUnderscore

चेकआईड: SA1309

कारण: C # में एक फ़ील्ड का नाम अंडरस्कोर से शुरू होता है।

नियम विवरण:

इस नियम का उल्लंघन तब होता है जब किसी फ़ील्ड का नाम अंडरस्कोर से शुरू होता है।

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

यदि फ़ील्ड या चर का नाम Win32 या COM से संबंधित आइटम के नाम से मेल खाने के लिए है, और इस प्रकार अंडरस्कोर के साथ शुरू करने की आवश्यकता है, तो फ़ील्ड या चर को एक विशेष NativeMethods वर्ग में रखें। NativeMethods वर्ग कोई भी वर्ग होता है, जिसमें NativeMethods में नाम समाप्त होता है, और इसका उद्देश्य Win32 या COM रैपर के लिए प्लेसहोल्डर के रूप में होता है। यदि आइटम NativeMethods वर्ग में रखा जाता है, तो StyleCop इस उल्लंघन को अनदेखा कर देगा।

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

संपादित करें: अनुवर्ती कार्रवाई के रूप में, स्टाइलकॉप का प्रोजेक्ट पेज यहां स्थित है: https://github.com/DotNetAnalyzers/StyleCopAnalyzers । हेल्प फ़ाइल के माध्यम से पढ़ने से कई तरह के स्टाइलिस्टिक्स नियमों के बारे में पता चलता है।


7
यह ज्यादातर एक "सर्वोत्तम अभ्यास" है। जैसा कि नियम कहता है, "सिंटिक" के साथ किसी भी गैर-स्थैतिक सदस्य के साथ प्रीफ़िक्सिंग किया जा सकता है जबकि भाषा के सिंटैक्स नियमों के कारण किसी भी चीज़ के साथ प्रीफ़िक्सिंग लागू नहीं हो सकती है। "यह" कीवर्ड इच्छित गंतव्य को मामूली स्पष्ट करता है।
स्कॉट डोरमैन

5
मैं समस्या के भाषा के इच्छित समाधान ("यह") के आस-पास होने के कृत्रिम तरीकों पर भी एहसान करता हूं।
गलकटर

10
उसी सॉफ़्टवेयर में एक नियम भी है जो कहता है कि आपके पास केवल मामले में दो फ़ील्ड अलग-अलग नहीं होने चाहिए। तो आप एक सार्वजनिक संपत्ति द्वारा लिपटे एक संरक्षित चर के साथ क्या करते हैं?
लिलिथ रिवर

5
'नो अंडरस्कोर' चीज के साथ मेरी एकमात्र समस्या यह है कि जब किसी (वेब) फॉर्म या इस तरह के खिलाफ प्रोग्रामिंग की जाती है, तो सिर्फ 'इस' का उपयोग करने से मुझे उन सभी निजी क्षेत्रों के लिए फ़िल्टर करने में मदद नहीं मिलती है जिन्हें मैंने परिभाषित किया है और इसके बजाय मुझे बस देता है उक्त वस्तु के साथ शामिल आठ मिलियन अन्य संपत्तियों की एक विशाल सूची।

14
स्टाइलकॉप कह रहा है कि, अगर मैं thisकिसी भी वर्ग के सदस्य का उल्लेख करते समय लगातार उपयोग करता हूं, तो मैं सभी वर्ग के सदस्यों को सभी कॉल बस खोज कर पा सकता हूं this। मैं इसके साथ बहस नहीं कर सकता, लेकिन मैं उस समय के बारे में भी नहीं सोच सकता जहाँ मुझे ऐसा करने की आवश्यकता थी। आखिरी चीज जो मैं करना चाहता हूं, वह कोडिंग को जोड़ना है और लगभग कोई व्यावहारिक लाभ के लिए मेरे कोड को this(जो लगभग हंगेरियन है) के साथ जोड़ना है । तथ्य यह है, अगर मैं कोड की एक पंक्ति को देख रहा हूं, तो कुछ भी जो एक बड़े अक्षर या अंडरस्कोर से शुरू होता है, एक वर्ग का सदस्य है, कुछ भी कम मामला स्थानीय है।
देवकार

27

चूंकि हम एक निजी क्षेत्र के बारे में बात कर रहे हैं, यह आपकी कक्षा के उपयोगकर्ता को प्रभावित नहीं करता है।

लेकिन मैं निजी क्षेत्र के लिए एक अंडरस्कोर का उपयोग करने की सलाह देता हूं, क्योंकि यह कोड को समझने में आसान बना सकता है, जैसे:

private int foo;
public void SetFoo(int foo)
{
  // you have to prefix the private field with "this."
  this.foo = foo;

  // imagine there's lots of code here,
  // so you can't see the method signature



  // when reading the following code, you can't be sure what foo is
  // is it a private field, or a method-argument (or a local variable)??
  if (foo == x)
  {
    ..
  }
}

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


14
वैसे मैं हमेशा 'इस' के साथ उपसर्ग करता हूं, चाहे मैं किसी क्षेत्र, संपत्ति या विधि का आरोप लगा रहा हूं।
TheCodeJunkie

9
मेरे लिए, अंडरस्कोर "यह" के शॉर्टहैंड नोटेशन की तरह है।
M4N

2
आर # में, सलाह पैरामीटर फू को न कहने के लिए है। आप इसे 'वैल्यू' क्यों नहीं कहते क्योंकि आपको पता है कि इसका इस्तेमाल सेट फू के लिए किया जाएगा?
थिंकफेयरकोडिंग

17
@Martin: "यह" के लिए एक शॉर्टहैंड के रूप में अंडरस्कोर के साथ समस्या यह है कि यह आवश्यक रूप से सभी वर्ग सदस्यों पर लागू नहीं किया जा सकता है जबकि "यह" कर सकते हैं। मुझे लगता है कि कोड "यह" कीवर्ड के साथ बहुत आसान / क्लीनर पढ़ता है। आपके उदाहरण में, if (foo == x) हमेशा पैरामीटर foo को संदर्भित करेगा।
स्कॉट डोरमैन

3
@ TheCodeJunkie: आपके कोड बेस में निरर्थक पात्रों की एक पूरी बहुत कुछ है।
एड।

15

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

मैं this.खोजशब्द को घृणा करता हूँ यह सिर्फ मेरी राय में बहुत अधिक कोड शोर जोड़ता है। मुझे लगता है कि Resharper का निष्कासन बहुत पसंद है। कीवर्ड।

6 साल का अपडेट: मैं Dictionary<TKey,T>समवर्ती पहुंच के एक विशिष्ट उपयोग के लिए आंतरिक का विश्लेषण कर रहा था और एक स्थानीय चर होने के लिए एक निजी क्षेत्र को गलत समझा। निजी क्षेत्र निश्चित रूप से स्थानीय चर के समान नामकरण सम्मेलन नहीं होना चाहिए। यदि कोई अंडरस्कोर होता, तो यह अविश्वसनीय रूप से स्पष्ट होता।


18
thisकीवर्ड वर्तमान वस्तु के लिए एक गारंटी संदर्भ है। आप एक अंडरस्कोर के साथ नहीं मिलता है। लोटने की जरूरत नहीं this
जेसन एस

15
क्यों एक 'मानक' का आविष्कार किया। 'यह।' आपको बताता है कि वस्तु एक उदाहरण चर 'क्लास' है। आपको यह बताता है कि यह एक वर्ग परिवर्तनीय है। बाकी सब एक स्टैक चर है। अंडरस्कोर बुरे विचारों के उसी ढेर पर है जहां हंगेरियन नोटेशन अब विघटित हो गया है।
क्वार्कली

4
@ DRAirey1 को यह याद रखना बहुत आसान है। जब आपको इसकी आवश्यकता होती है और आप राज्य के साथ अजीब चीजें करना शुरू करते हैं।
क्रिस मैरिकिक

3
@ChrisMarisic आप बेशक उपयोग के बारे में अपनी राय में स्वागत करते हैं _, लेकिन जब यह स्पष्ट रूप से नहीं है तो इसे स्थापित मानक के रूप में प्रस्तुत न करें।
क्रश करें

3
मैंने आपको "मैं अपनी शैली बनाने के लिए चला गया" खो दिया।
rory.ap

12

मुझे अंडरस्कोर पसंद है, क्योंकि तब मैं लोअरकेस नाम का उपयोग इस तरह विधि मापदंडों के रूप में कर सकता हूं:

public class Person
{
    string _firstName;

    public MyClass(string firstName)
    {
        _firstName = firstName;
    }

    public string FirstName
    {
        get { return _firstName; }
    }
}

39
सार्वजनिक स्ट्रिंग FirstName {प्राप्त करें; निजी सेट; }
जेसन

3
आप अभी भी thisकीवर्ड का उपयोग करके लोअरकेस को विधि पैरामीटर के रूप में उपयोग कर सकते हैं। चल रहा है और हमेशा विवादास्पद "न करने के लिए" या नहीं में एक मूक बिंदु बनाना:public MyClass(string firstName){ this.firstName = firstName; }
mateuscb

5
यह भविष्य है, अब बस public string FirstName { get; }और सेटर अभी भी कंस्ट्रक्टर में उपलब्ध है
क्रिस मैरिसिक

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

9

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

हालाँकि, हाल के दिनों में मुझे पता चला है कि निजी सदस्यों के लिए अंडरस्कोर उपसर्ग का उपयोग करने पर भले ही मुझे यकीन नहीं हो रहा है कि क्यों। शायद किसी और को पता है? क्या यह सिर्फ उपसर्ग सिद्धांत है? या जेनेरिक प्रकारों के नामकरण के साथ कुछ था जो संकलित विधानसभाओं में उन्हें अंडरस्कोर मिलता है या कुछ और?


4
मेरे लिए _ जब कोड के माध्यम से _scanning जल्दी से _words को बंद कर देता है, तो यह कम हो जाता है जैसे कि _and _more पढ़ने के लिए _every _ पर रोकना और इसे स्वीकार करने के लिए _ _ इसे कुछ एस्कॉर्ट का नियंत्रण वर्ण _ _not नहीं करना है। यह व्यावहारिक रूप से एक स्तंभ को दाईं ओर नाम के पहले उपयोगी चरित्र को धक्का देकर इंडेंटिंग को बाधित करता है। मैं आम तौर पर C ++ को नापसंद करता हूं क्योंकि अधिकांश C ++ - प्रोग्रामर अविश्वसनीय रूप से बहुत धीमी और धीमी गति से पढ़े जाने वाले प्रतीक / मशीन-जैसे कोड लिखते हैं और मैं बस C # कोड में ऐसा नहीं करना पसंद करता हूं :)
Oskar Duveborn

23
मेरे लिए, यह। यह जल्दी से जब कोड के माध्यम से इस। पासवर्ड ऊपर clutters, यह सिर्फ इस पढ़ने की तरह कम हो जाता है। और यह। यह रोकने के लिए और इस तरह से यह हो रहा है। इसे स्वीकार करने के लिए और यह है। यह यह है। यह कुछ का एक नियंत्रण चरित्र नहीं है। मैं कभी-कभार ढूंढना पसंद करूंगा _fieldFooया _fieldBarमेरे उपयोग के साथ this.fieldFooया उससे अधिक क्लू किया जा सकता है this.fieldBar। मुझे लगता है कि this.उपसर्ग एक प्रमुख अंडरस्कोर की तुलना में बहुत अधिक परेशान करने वाला है।
एगिएरिक

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

1
@AggieEric ने वहां सिर पर कील ठोक दी। बस उसका वाक्य पढ़ने से मुझे सिर दर्द होता है! मैंने इस मामले में वर्षों तक एमएस की सिफारिश पर टिके रहने की कोशिश की, और मुझे thisहर जगह छोटे नीले शब्दों को पढ़ने के लिए बहुत पसंद आया , मैंने वहीं एक नीरस-क्रोध निर्णय लिया। अब, मैं धार्मिक रूप से thisकेवल संपत्ति के संदर्भ के लिए उपयोग करता हूं , या जब मुझे स्पष्ट रूप से thisऔर के बीच अंतर करने की आवश्यकता होती है base। प्रत्येक अपने स्वयं के, मुझे लगता है :-)
Riegardt Steyn

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

5

शैली कॉप की सिफारिश या नहीं, .NET फ्रेमवर्क में खुदाई करने से सदस्य चर के लिए "_" उपयोग का पता चलता है। स्टाइल कॉप के निर्माता जो भी सलाह देते हैं, यह एमएस कर्मचारियों के बहुमत का उपयोग नहीं कर रहा है। :) तो मैं अंडरस्कोर के साथ रहना होगा। क्योंकि मैं व्यक्तिगत रूप से अंडरस्कोर का उपयोग करते हुए बहुत कम गलतियाँ करता हूं, तो यह (उदाहरण: varName = varName का उपयोग इसके बजाय। नाम = varName, यह वास्तव में मुझ में अटक गया है)


3
.NET कोर स्टाइल गाइड के लिए अंडरस्कोर की भी सिफारिश की गई है: github.com/dotnet/corefx/wiki/Coding-style
Landoncz

3

मुझे लगता है कि भाषा के डिजाइन में वर्ग और बड़े स्तर के क्षेत्र एक गलती हैं। अगर सी # की संपत्तियों का अपना स्थानीय दायरा होता तो मैं इसे पसंद करता:

public int Foo
{
   private int foo;
   get
   {
      return foo;
   }
   set
   {
      foo = value;
   }
}

इससे खेतों का उपयोग पूरी तरह से रोकना संभव हो जाएगा।

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


C # गैंग आपके साथ नए निजी इंट फू {get के साथ सहमत प्रतीत होता है; सेट;} सिंटैक्स शुगर।
दना

हा ज़रूर; मैं यहाँ जो वर्णन कर रहा हूँ, वह इसके बिना पूरी तरह से असाध्य है।
रॉबर्ट रॉसनी

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

नहीं, मैं ऑटो-कार्यान्वित गुणों का वर्णन नहीं कर रहा हूं, कम से कम मेरे उदाहरण में नहीं। मैं एक स्कूपिंग स्तर का वर्णन कर रहा हूं जो C # या VB में मौजूद नहीं है। यह वास्तव में दुर्भाग्यपूर्ण है कि वीबी ने समर्थन वाले क्षेत्रों के नामों को मिटाने के लिए ऐसा तुच्छ तरीका चुना। C # की बदसूरत पर्याप्त है कि आप कभी भी दुर्घटना के नाम से एक चर नहीं बना पाएंगे।
राबर्ट रोसनी

3

निजी क्षेत्रों के लिए _fieldName संकेतन को तोड़ना इतना आसान है । "यह" का उपयोग करना। अंकन को तोड़ना असंभव है। आप _ संकेतन को कैसे तोड़ेंगे? का निरीक्षण करें:

private void MyMethod()
{
  int _myInt = 1; 
  return; 
}

वहाँ तुम जाओ, मैंने सिर्फ तुम्हारे नामकरण सम्मेलन का उल्लंघन किया है लेकिन यह संकलन करता है। मैं एक नामकरण सम्मेलन करना चाहता हूँ जो कि a) आयु और b) स्पष्ट नहीं है। मैं हंगेरियाई नामकरण से दूर होने के पक्ष में हूं और यह एक तरह से योग्य है। चर नाम के सामने किसी ऑब्जेक्ट के प्रकार के बजाय आपके पास इसका पहुंच स्तर है।

रूबी के साथ इसका विरोध करें जहां चर @my_numberका नाम गुंजाइश में नाम को जोड़ता है और अटूट है।

संपादित करें: यह उत्तर नकारात्मक हो गया है। मुझे परवाह नहीं है, यह रहता है।


11
यह कहना मुश्किल है कि यह नामकरण सम्मेलन का एक वैध समालोचक है जो डेवलपर्स के लिए इसका पालन नहीं करना संभव है।
रॉबर्ट रॉसनी

8
वाह, आपकी "आसान तोड़ने की" परिभाषा और मेरा है, जैसे, पूर्ण विपरीत। तुम्हारा मतलब "जानबूझकर तोड़ना आसान है", जबकि अधिकांश अन्य लोगों का मतलब " गलती से टूटना आसान " है। मैं इसे पढ़ने के लिए एक अभ्यास के रूप में छोड़ दूंगा कि कौन सा पठनीय कोड लिखने में अधिक प्रासंगिक है ...
कोनराड रूडोल्फ

6
@ कोनराड: जब आप "पाठक को एक अभ्यास के रूप में" कहते हैं, तो आप दिखावा करते हैं। यह एक गणित की पाठ्यपुस्तक नहीं है।
jcollum

3
थोड़ा कम नकारात्मक अब :) जबकि हम वर्तमान के खिलाफ रोइंग हो सकते हैं, मैं अंडरस्कोर सम्मेलन को भी नापसंद करता हूं। मेरे विचार में यह हंगेरियन संकेतन के लिए अलग नहीं है और ईमानदार होने के लिए, यह मेरी आँखों को रक्तस्राव करता है (पठनीयता को चोट पहुँचाता है)। हमने हंगेरियन नोटेशन को C # से बाहर फेंक दिया और यह समय है कि आप अपने IDE पर भरोसा न करने के इस अंतिम परिणाम को प्राप्त करें।
टिम लॉन्ग

1
मैंने सुना है कि एमएस वास्तव में कहता है कि अंडरस्कोर का उपयोग इसके सी # स्टाइल गाइड में नहीं किया जाना है। blogs.msdn.microsoft.com/brada/2005/01/26/… - खंड 2.6 - ब्रैड अब्राम हमारे साथ कम से कम सहमत हैं!
जूलम

1

जब आप चाहते हैं कि आपकी विधानसभा सीएलएस अनुरूप हो, तो आप अपनी असेंबली फाईल में CLSCompliant विशेषता का उपयोग कर सकते हैं। कंपाइलर तब शिकायत करेगा जब आपके कोड में सामान है जो cls compliant नहीं है।

फिर, जब आपके पास 2 गुण होते हैं जो केवल मामले में भिन्न होते हैं, तो संकलक एक त्रुटि जारी करेगा। दूसरी ओर, जब आपके पास एक निजी क्षेत्र और एक ही वर्ग में सार्वजनिक संपत्ति होती है, तो कोई समस्या नहीं होगी।

(लेकिन, मैं हमेशा अपने निजी सदस्यों को एक अंडरस्कोर के साथ उपसर्ग करता हूं। यह मुझे यह स्पष्ट करने में भी मदद करता है कि जब मैंने अपना कोड पढ़ा कि एक निश्चित चर एक सदस्य क्षेत्र है)।


0

मुझे दो कारणों से अपने निजी क्षेत्रों के सामने अंडरस्कोर का उपयोग करना पसंद है। एक पहले ही उल्लेख किया गया है, फ़ील्ड कोड और इन्टेलिसेंस में अपने संबंधित गुणों से बाहर खड़े हैं। दूसरा कारण यह है कि मैं समान नामकरण सम्मेलनों का उपयोग कर सकता हूं चाहे मैं VB या C # में कोडिंग कर रहा हूं।


1
वाह, क्या वह बुद्धिमान है? VB में अंडरस्कोर का मतलब 'अगली पंक्ति पर जारी' नहीं है?
JBRWilkinson

1
केवल अगर अंडरस्कोर एक स्थान के बाद है।
रॉब विंडसर

प्रारंभिक पत्र निचला मामला या ऊपरी मामला मेरे लिए ठीक है :)
मनोदोत्र

0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.