नामकरण सम्मेलन - C ++ और C # चर में अंडरस्कोर


146

_varवर्ग क्षेत्र में एक चर नाम देखना आम है । अंडरस्कोर का क्या मतलब है? क्या इन सभी विशेष नामकरण सम्मेलनों के लिए एक संदर्भ है?



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

26
@ माइक - आपका कंबल बयान अभी सच नहीं है। मैंने पाया है कि इस सम्मेलन का उपयोग करने से विधियों को जल्दी से स्कैन करना और कक्षा की अच्छी समझ प्राप्त करना आसान हो जाता है।
चोसपंडियन

12
@ChaosPandion: फिर इसे एक कंबल कथन के रूप में न पढ़ें। "कुछ" का अर्थ "सब" नहीं है, और "सभी भी अक्सर" का अर्थ "हमेशा" नहीं होता है, और शायद आप मेरे अनुभव के अपवाद हैं।
माइक सेमोर

17
C ++ में, प्रमुख अंडरस्कोर से बचें । कई संदर्भों में (अर्थात वैश्विक दायरे में, जब कोई पूंजी पत्र आदि का अनुसरण होता है) वे कार्यान्वयन के लिए आरक्षित होते हैं, और आप वास्तव में उन पर कुछ स्थूल रौंद होने का जोखिम उठाते हैं। इसलिए यदि आप उन्हें चाहते हैं, तो उन्हें अंडरस्कोर करने के लिए तैयार करें
sbi

जवाबों:


120

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

C ++ में, एक अंडरस्कोर आमतौर पर एक निजी सदस्य चर को इंगित करता है।

C # में, मैं आमतौर पर इसका उपयोग केवल सार्वजनिक संपत्ति के लिए अंतर्निहित निजी सदस्य चर को परिभाषित करते समय देखता हूं। अन्य निजी सदस्य चर का अंडरस्कोर नहीं होगा। हालांकि यह उपयोग काफी हद तक स्वचालित गुणों के आगमन के साथ हुआ है।

इससे पहले:

private string _name;
public string Name
{
    get { return this._name; }
    set { this._name = value; }
}

उपरांत:

public string Name { get; set; }

11
उन टीमों को छोड़कर जो चाहते हैं कि उनके गुण अपरिवर्तनीय हों।
चोसपंडियन

11
अंडरस्कोर से शुरू होने वाले पहचानकर्ता संकलक के लिए आरक्षित हैं। उपसर्ग अंडरस्कोर का उपयोग करना संकलक प्रतीकों के साथ संघर्ष कर सकता है
थॉमस मैथ्यूज

12
@ थोमस मैथ्यूज - सी # में नहीं।
ईएमपी

11
@ChaosPandion मैं यह मान रहा हूं कि "अपरिवर्तनीय" से आपका क्या मतलब है, वास्तव में "केवल पढ़ने के लिए", जिस स्थिति में कोई भी उपयोग कर सकता है public string Name { get; private set; }। सच है, यह पूरी तरह से अपरिवर्तनीय नहीं है, लेकिन यह वहां है।
jdicichal

7
@Thomas एक वर्ग के संदर्भ में, पहचानकर्ता अंडरस्कोर से शुरू होता है और उसके बाद C ++ में एक कैपिटल अक्षर आरक्षित होता है। _varआरक्षित नहीं है।
टायलर मैकहेनरी

84

C ++ में किसी भी चर नाम या पैरामीटर नाम से पहले UNDERSCORES का उपयोग नहीं करना सबसे अच्छा अभ्यास है

एक अंडरस्कोर या एक डबल अंडरस्कोर के साथ शुरू होने वाले नाम सी ++ कार्यान्वयनकर्ताओं के लिए आरक्षित हैं। अंडरस्कोर वाले नाम लाइब्रेरी में काम करने के लिए आरक्षित हैं।

यदि आप C ++ कोडिंग मानक पर पढ़ते हैं, तो आप देखेंगे कि पहले पृष्ठ में यह कहा गया है:

"नामकरण को ओवरलीग न करें, लेकिन एक सुसंगत नामकरण सम्मेलन का उपयोग करें: केवल दो ही हैं-डॉस: ए) कभी भी" अंडरहैंड किए गए नामों का उपयोग नहीं करते हैं, "जो अंडरस्कोर से शुरू होते हैं या जिनमें डबल अंडरस्कोर होता है;" (P2, C ++ कोडिंग मानक, हर्ब सटर और आंद्रेई अलेक्जेंड्रेस्कु)

विशेष रूप से, आईएसओ कामकाजी मसौदा वास्तविक नियमों को बताता है:

इसके अलावा, कुछ पहचानकर्ता C ++ कार्यान्वयन द्वारा उपयोग के लिए आरक्षित हैं और अन्यथा उपयोग नहीं किए जाएंगे; कोई निदान की आवश्यकता नहीं है। (ए) प्रत्येक पहचानकर्ता जिसमें एक डबल अंडरस्कोर __ होता है या एक अंडरस्कोर द्वारा शुरू होता है जिसके बाद एक अपरकेस अक्षर किसी भी उपयोग के लिए कार्यान्वयन के लिए आरक्षित होता है। (बी) प्रत्येक पहचानकर्ता जो एक अंडरस्कोर से शुरू होता है, वैश्विक नामस्थान में एक नाम के रूप में उपयोग के लिए कार्यान्वयन के लिए आरक्षित है।

यदि आप गलती से उपरोक्त सीमाओं में से एक में भटकते हैं, तो एक अंडरस्कोर के साथ एक प्रतीक शुरू करने से बचने के लिए सबसे अच्छा अभ्यास है।

आप अपने लिए इसे देख सकते हैं कि सॉफ्टवेयर विकसित करते समय अंडरस्कोर का ऐसा उपयोग विनाशकारी क्यों हो सकता है:

इस तरह से एक सरल helloWorld.cpp प्रोग्राम संकलित करने का प्रयास करें:

g++ -E helloWorld.cpp

आपको वह सब दिखाई देगा जो पृष्ठभूमि में होता है। यहाँ एक स्निपेट है:

   ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
   try
     {
       __streambuf_type* __sb = this->rdbuf();
       if (__sb)
  {
    if (__sb->pubsync() == -1)
      __err |= ios_base::badbit;
    else
      __ret = 0;
  }

आप देख सकते हैं कि कितने नाम डबल अंडरस्कोर से शुरू होते हैं!

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

यदि आप अंडरस्कोर का उपयोग करते हैं, तो आप संघर्ष के मुद्दों में पड़ सकते हैं और आपको कोई नुकसान नहीं होगा, क्योंकि यह बहुत देर हो चुकी है।


4
ऐसे नाम नहीं हैं जो वैश्विक या फ़ाइल स्कोप नहीं हैं और अंडरस्कोर और लोअर केस लेटर से शुरू होते हैं जो पूरी तरह से ठीक हैं? मैं यह हर समय करता हूं क्योंकि यह विशिष्ट मामलों के लिए बहुत साफ है, उदाहरण के लिए: void A :: set_size (int _size) {size = _size; }। इस तरह के तुच्छ उपयोगों के लिए आप क्या करते हैं?
टुकरा

3
मेरे द्वारा मानने वाले गैर-वैश्विक / फ़ाइल स्कोप में निम्न केस पत्र के बाद अंडरस्कोर की अनुमति है। क्या आप मुझे बता सकते हैं कि मानक में यह कहाँ नहीं है? अंडरस्कोर अनुगामी के साथ समस्या यह है कि मैं पहले से ही सदस्य var के लिए कभी-कभी उपयोग करता हूं। इसलिए मेरे पास फंक्शन हो सकता है 'int size ();' सदस्य var 'int size_;' और तर्क 'int _size'। यह अच्छी तरह से चीजों को कवर करने के लिए जाता है और मैंने बेहतर विकल्प नहीं देखे हैं। एसटीएल के साथ काम करने वाले जेनेरिकों के लिए पूंजीगत फ़न संभव नहीं है। 'यह' आकार 'शैली कि C # जैसे लोगों को मुझसे त्रुटि महसूस होती है जब तक कि आप हमेशा इसका उपयोग सदस्य के उपयोग के लिए न करें जो कि बदसूरत है।
तुकरा

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

3
@tukra: यह पूरी तरह से कानूनी नहीं है । C ++ मानक केवल आपको स्थानीय स्कोप में एक लोअरकेस अक्षर के बाद एकल अंडरस्कोर का उपयोग करने की अनुमति देता है। सौभाग्य! :-)
कॉन्स्टैंटिनोस गेलिनोस

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

45

दरअसल यह _varसम्मेलन VB नहीं C # या C ++ (m _, ... एक और बात है) से आता है।

यह गुण घोषित करते समय वीबी की असंवेदनशीलता को दूर करने के लिए आया था।

उदाहरण के लिए, इस तरह के कोड VB में है क्योंकि यह मानता है संभव नहीं है userऔर Userएक ही पहचानकर्ता के रूप में

Private user As String

Public Property User As String
  Get
    Return user
  End Get
  Set(ByVal Value As String)
    user = value
  End Set
End Property

तो इस पर काबू पाने के लिए, कुछ ने इस तरह से आने के लिए निजी क्षेत्र में '_' जोड़ने के लिए एक सम्मेलन का इस्तेमाल किया

Private _user As String

Public Property User As String
  Get
    Return _user
  End Get
  Set(ByVal Value As String)
    _user = value
  End Set
End Property

चूँकि कई कन्वेंशन .Net के लिए हैं और C # et VB.NET कन्वेंशन के बीच कुछ एकरूपता रखने के लिए, वे उसी का उपयोग कर रहे हैं।

मुझे जो मैं कह रहा था उसका संदर्भ मिला: http : //10rem.net/articles/net-naming-conventions-and-programming-standards---best-practices

ऊंट केस लीडिंग अंडरस्कोर के साथ। VB.NET में, हमेशा "संरक्षित" या "निजी" इंगित करें, "मंद" का उपयोग न करें। "M_" का उपयोग हतोत्साहित किया जाता है, जैसा कि एक चर नाम का उपयोग होता है, जो केवल मामले से संपत्ति से अलग होता है, विशेष रूप से संरक्षित चर के साथ जो अनुपालन का उल्लंघन करता है, और यदि आप VB.NET में प्रोग्राम करते हैं, तो आपके जीवन को दर्द होगा। अपने सदस्यों को एक्सेसर / म्यूटेटर गुणों से अलग कुछ नाम देना होगा। यहां सभी वस्तुओं में से, प्रमुख अंडरस्कोर वास्तव में एकमात्र विवादास्पद है। मैं व्यक्तिगत रूप से अपने निजी चर के लिए सीधे अंडरस्कोर-कम ऊंट के मामले में इसे पसंद करता हूं ताकि मुझे "इस" नाम के साथ चर को योग्य न करना पड़े। कंस्ट्रक्टर्स या अन्य जगहों पर मापदंडों से अलग होने की संभावना है जहां मुझे नामकरण की टक्कर होगी। VB.NET के मामले में असंवेदनशीलता के साथ, यह और भी महत्वपूर्ण है क्योंकि आपके एक्सेसर के गुणों में आमतौर पर अंडरस्कोर को छोड़कर आपके निजी सदस्य चर के समान नाम होगा। जहाँ तक m_ जाता है, यह वास्तव में सिर्फ सौंदर्यशास्त्र के बारे में है। मैं (और कई अन्य) m_ बदसूरत पाते हैं, क्योंकि ऐसा लगता है कि चर नाम में एक छेद है। यह लगभग आक्रामक है। मैं हर समय VB6 में इसका इस्तेमाल करता था, लेकिन यह केवल इसलिए था क्योंकि चर एक अग्रणी अंडरस्कोर नहीं हो सकते थे। मैं यह देखकर खुश नहीं हो सकता था कि वह चली जाए। Microsoft ने m_ (और सीधे _) के खिलाफ अनुशंसा की, भले ही उन्होंने अपने कोड में दोनों किया हो। इसके अलावा, एक सीधे "एम" के साथ उपसर्ग करना सही है। बेशक, चूंकि वे मुख्य रूप से सी # में कोड करते हैं, उनके पास निजी सदस्य हो सकते हैं जो केवल गुणों के मामले में भिन्न होते हैं। VB लोगों को कुछ और करना होगा। कोशिश करने और भाषा-दर-भाषा विशेष मामलों के साथ आने के बजाय, मैं सभी भाषाओं के लिए प्रमुख अंडरस्कोर की सिफारिश करता हूं जो इसका समर्थन करेंगे। यदि मैं चाहता हूं कि मेरी कक्षा पूरी तरह से सीएलएस-अनुरूप हो, तो मैं किसी भी # सुरक्षित सदस्य चर पर उपसर्ग छोड़ सकता हूं। हालांकि, मैं इस बारे में कभी चिंता नहीं करता, क्योंकि मैं सभी संभावित संरक्षित सदस्य चर को निजी रखता हूं, और इसके बजाय संरक्षित एक्सेसर्स और म्यूटेटर की आपूर्ति करता हूं। क्यों: संक्षेप में, यह सम्मेलन सरल (एक चरित्र) है, पढ़ने में आसान है (आपकी आंख अन्य प्रमुख पात्रों से विचलित नहीं है), और सफलतापूर्वक प्रक्रिया-स्तरीय चर और वर्ग-स्तरीय गुण के साथ नामकरण टकराव से बचा जाता है। । मैं सभी भाषाओं के लिए अग्रणी अंडरस्कोर की सिफारिश करता हूं जो इसका समर्थन करेंगे। यदि मैं चाहता हूं कि मेरी कक्षा पूरी तरह से सीएलएस-अनुरूप हो, तो मैं किसी भी # सुरक्षित सदस्य चर पर उपसर्ग छोड़ सकता हूं। हालांकि, मैं इस बारे में कभी चिंता नहीं करता, क्योंकि मैं सभी संभावित संरक्षित सदस्य चर को निजी रखता हूं, और इसके बजाय संरक्षित एक्सेसर्स और म्यूटेटर की आपूर्ति करता हूं। क्यों: संक्षेप में, यह सम्मेलन सरल (एक चरित्र) है, पढ़ने में आसान है (आपकी आंख अन्य प्रमुख पात्रों से विचलित नहीं है), और सफलतापूर्वक प्रक्रिया-स्तरीय चर और वर्ग-स्तरीय गुण के साथ नामकरण टकराव से बचा जाता है। । मैं सभी भाषाओं के लिए अग्रणी अंडरस्कोर की सिफारिश करता हूं जो इसका समर्थन करेंगे। यदि मैं चाहता हूं कि मेरी कक्षा पूरी तरह से सीएलएस-अनुरूप हो, तो मैं किसी भी # सुरक्षित सदस्य चर पर उपसर्ग छोड़ सकता हूं। हालांकि, मैं इस बारे में कभी चिंता नहीं करता, क्योंकि मैं सभी संभावित संरक्षित सदस्य चर को निजी रखता हूं, और इसके बजाय संरक्षित एक्सेसर्स और म्यूटेटर की आपूर्ति करता हूं। क्यों: संक्षेप में, यह सम्मेलन सरल (एक चरित्र) है, पढ़ने में आसान है (आपकी आंख अन्य प्रमुख पात्रों से विचलित नहीं है), और सफलतापूर्वक प्रक्रिया-स्तरीय चर और वर्ग-स्तरीय गुण के साथ नामकरण टकराव से बचा जाता है। । मैं इस बारे में कभी चिंता नहीं करता क्योंकि मैं सभी संभावित संरक्षित सदस्य चर को निजी रखता हूं, और इसके बजाय संरक्षित एक्सेसर्स और म्यूटेटर की आपूर्ति करता हूं। क्यों: संक्षेप में, यह सम्मेलन सरल (एक चरित्र) है, पढ़ने में आसान है (आपकी आंख अन्य प्रमुख पात्रों से विचलित नहीं है), और सफलतापूर्वक प्रक्रिया-स्तरीय चर और वर्ग-स्तरीय गुण के साथ नामकरण टकराव से बचा जाता है। । मैं इस बारे में कभी चिंता नहीं करता क्योंकि मैं सभी संभावित संरक्षित सदस्य चर को निजी रखता हूं, और इसके बजाय संरक्षित एक्सेसर्स और म्यूटेटर की आपूर्ति करता हूं। क्यों: संक्षेप में, यह सम्मेलन सरल (एक चरित्र) है, पढ़ने में आसान है (आपकी आंख अन्य प्रमुख पात्रों से विचलित नहीं है), और सफलतापूर्वक प्रक्रिया-स्तरीय चर और वर्ग-स्तरीय गुण के साथ नामकरण टकराव से बचा जाता है। ।


6

पहले टिप्पणीकार (आर सैमुअल क्लैचको) ने संदर्भित किया: सी ++ पहचानकर्ता में अंडरस्कोर का उपयोग करने के बारे में क्या नियम हैं? जो C ++ में अंडरस्कोर के बारे में सवाल का जवाब देता है। सामान्य तौर पर, आप एक प्रमुख अंडरस्कोर का उपयोग करने वाले नहीं हैं, क्योंकि यह आपके कंपाइलर के कार्यान्वयन के लिए आरक्षित है। आप जिस कोड के साथ देख रहे हैं, _varवह या तो विरासत कोड है, या किसी के द्वारा लिखा गया कोड जो पुराने नामकरण प्रणाली का उपयोग करके बड़ा हुआ है जो अग्रणी अंडरस्कोर पर नहीं चढ़ा था।

अन्य उत्तर के रूप में, यह कक्षा सदस्य चर की पहचान करने के लिए C ++ में उपयोग किया जाता है। हालाँकि, इसका कोई विशेष अर्थ नहीं है जहाँ तक सज्जाकार या वाक्यविन्यास जाता है। इसलिए यदि आप इसका उपयोग करना चाहते हैं, तो यह संकलन करेगा।

मैं सी # चर्चा दूसरों पर छोड़ दूंगा।


5

_वर का कोई अर्थ नहीं है और केवल यह भेद करना आसान बनाने के उद्देश्य से कार्य करता है कि चर एक निजी सदस्य चर है।

C ++ में, _var कन्वेंशन का उपयोग करना खराब रूप है, क्योंकि एक पहचानकर्ता के सामने अंडरस्कोर के उपयोग को नियंत्रित करने वाले नियम हैं। _var एक वैश्विक पहचानकर्ता के रूप में आरक्षित है, जबकि _Var (अंडरस्कोर + कैपिटल लेटर) कभी भी आरक्षित है। यही कारण है कि C ++ में, आप लोगों को इसके बजाय var_ सम्मेलन का उपयोग करते हुए देखेंगे।


4

आप अपनी खुद की कोडिंग दिशानिर्देश बना सकते हैं। बस बाकी टीम के लिए एक स्पष्ट दस्तावेज लिखें।

_Field का उपयोग करने से Intelilsense को केवल टाइपिंग _ सभी वर्ग चर को फ़िल्टर करने में मदद मिलती है।

मैं आमतौर पर ब्रैड एडम्स दिशानिर्देशों का पालन करता हूं , लेकिन यह अंडरस्कोर का उपयोग नहीं करने की सिफारिश करता है।


2

C # के लिए Microsoft नामकरण मानक कहता है कि चर और मापदंडों को कम ऊँट केस फॉर्म IE का उपयोग करना चाहिए paramName। मानक भी फ़ील्ड के लिए उसी फॉर्म का पालन करने के लिए कहता है लेकिन इससे अस्पष्ट कोड हो सकता है ताकि स्पष्टता IE को बेहतर बनाने के लिए कई टीम अंडरस्कोर उपसर्ग का आह्वान करें _fieldName


2

C # के साथ, Microsoft फ्रेमवर्क डिज़ाइन दिशानिर्देश सार्वजनिक सदस्यों के लिए अंडरस्कोर वर्ण का उपयोग नहीं करने का सुझाव देते हैं । के लिए निजी सदस्यों, अंडरस्कोर उपयोग करने के लिए ठीक हैं। वास्तव में, जेफरी रिक्टर (अक्सर दिशानिर्देशों में उद्धृत) उदाहरण के लिए एक m_ और निजी स्थिर सदस्यों के लिए "s_" का उपयोग करता है।

निजी तौर पर, मैं अपने निजी सदस्यों को चिह्नित करने के लिए सिर्फ _ का उपयोग करता हूं। हंगेरियन नोटेशन पर "m_" और "s_" क्रिया है जो न केवल .NET में फॉलो की जाती है, बल्कि काफी क्रिया हो सकती है और मुझे कई सदस्यों के साथ कक्षाएं लगती हैं जो कि वर्णक्रमीय रूप से त्वरित रूप से आंख स्कैन करना मुश्किल है (कल्पना करें कि सभी 10 चर m_ से शुरू होते हैं) ।


चूंकि हंगेरियन नोटेशन प्रकार को इंगित करता है, मुझे नहीं लगता कि आप वास्तव में उस पर एम / एस कगार कह सकते हैं।
जेरी निक्सन

@ जैरीनेक्सन-एमएसएफटी क्या हम चर डेटा प्रकार और चर दृश्यता प्रकार की पहचान करते हैं जब यह हंगेरियन धारणा की बात आती है?
नेक्रो

1

मैं अपनी कक्षाओं के सदस्य चर के लिए _var नामकरण का उपयोग करता हूं। इसके 2 मुख्य कारण हैं:

1) जब मैं अपना कोड बाद में पढ़ रहा होता हूं, तो यह मुझे कक्षा चर और स्थानीय फ़ंक्शन चर का ट्रैक रखने में मदद करता है।

2) जब मैं एक वर्ग चर की तलाश कर रहा हूं तो यह इंटेलीसेन्स (या अन्य कोड-पूरा करने वाली प्रणाली) में मदद करता है। बस पहला वर्ण जानना उपलब्ध चर और विधियों की सूची के माध्यम से फ़िल्टर करने में सहायक है।


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

1

जहाँ तक C और C ++ भाषाओं का संबंध है, नाम में एक अंडरस्कोर (शुरुआत, मध्य या अंत) का कोई विशेष अर्थ नहीं है। यह सिर्फ एक वैध चर नाम चरित्र है। "सम्मेलनों" एक कोडिंग समुदाय के भीतर कोडिंग प्रथाओं से आते हैं।

जैसा कि ऊपर दिए गए विभिन्न उदाहरणों से पहले ही संकेत मिल चुका है, शुरुआत में _ का मतलब C ++ में किसी वर्ग के निजी या संरक्षित सदस्य हो सकते हैं।

मुझे केवल कुछ इतिहास दें जो मजेदार ट्रिविया हो सकते हैं। UNIX में यदि आपके पास एक कोर सी लाइब्रेरी फ़ंक्शन और एक कर्नेल बैक-एंड है, जहां आप कर्नेल फ़ंक्शन को उपयोगकर्ता स्थान में उजागर करना चाहते हैं और साथ ही _ फ़ंक्शन स्टब के सामने अटक जाता है जो कर्नेल फ़ंक्शन को सीधे कुछ और किए बिना कहता है। इसका सबसे प्रसिद्ध और परिचित उदाहरण BSD और SysV प्रकार कर्नेल के तहत बाहर निकलें () बनाम _exit () है: कर्नेल की निकास सेवा को कॉल करने से पहले उपयोगकर्ता-अंतरिक्ष सामान करता है, जबकि _exit कर्नेल की निकास सेवा के लिए मैप करता है।

तो _ का उपयोग इस मामले में "स्थानीय" सामान के लिए किया जाता था स्थानीय मशीन-स्थानीय। आमतौर पर _functions () पोर्टेबल नहीं थे। इसमें आपको विभिन्न प्लेटफार्मों पर समान व्यवहार की उम्मीद नहीं करनी चाहिए।

अब चर नामों में _ जैसे कि

int _foo;

अच्छी तरह से मनोवैज्ञानिक रूप से, एक _ शुरुआत में टाइप करने के लिए एक अजीब बात है। इसलिए यदि आप एक वैरिएबल नाम बनाना चाहते हैं जिसमें कुछ और के साथ टकराव की संभावना कम होगी, तो ESPECIALLY जब आप प्री-प्रोसेसर के विकल्प से निपटना चाहते हैं तो _ के उपयोग पर विचार करें।

मेरी मूल सलाह हमेशा आपके कोडिंग समुदाय के सम्मेलन का पालन करना होगा, ताकि आप अधिक प्रभावी ढंग से सहयोग कर सकें।


0

इसका सीधा सा मतलब है कि यह कक्षा में एक सदस्य क्षेत्र है।


0

कोई विशेष एकल नामकरण सम्मेलन नहीं है, लेकिन मैंने देखा है कि निजी सदस्यों के लिए।


0

बहुत से लोग निजी क्षेत्रों को एक अंडरस्कोर के साथ उपसर्ग करना पसंद करते हैं। यह सिर्फ एक नामकरण सम्मेलन है।

C # के 'आधिकारिक' नामकरण सम्मेलनों में निजी क्षेत्रों के लिए सरल लोअरकेस नाम (कोई अंडरस्कोर) नहीं है।

मुझे C ++ के लिए मानक सम्मेलनों की जानकारी नहीं है, हालांकि अंडरस्कोर बहुत व्यापक रूप से उपयोग किया जाता है।


0

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

वैसे भी, ये केवल कन्वेंशन हैं और आपको इन सभी के लिए एक भी स्रोत नहीं मिलेगा। वे शैली की बात कर रहे हैं और प्रत्येक प्रोग्रामिंग टीम, परियोजना या कंपनी का अपना (या यहां तक ​​कि कोई भी नहीं है)।


0

C # में इसका उपयोग करने का पूरी तरह से कानूनी कारण है: यदि कोड VB.NET से भी एक्स्टेंसिबल होना चाहिए। (अन्यथा, मैं नहीं होता।)

चूंकि VB.NET केस असंवेदनशील है, इसलिए fieldइस कोड में संरक्षित सदस्य तक पहुंचने का कोई सरल तरीका नहीं है :

public class CSharpClass
{
    protected int field;
    public int Field { get { return field; } }
}

उदाहरण के लिए, यह संपत्ति पाने वाले को एक्सेस करेगा, न कि फील्ड को:

Public Class VBClass
    Inherits CSharpClass

    Function Test() As Integer
        Return Field
    End Function

End Class

बिल्ली, मैं भी नहीं लिख सकता field लोअरकेस में - वीएस 2010 सिर्फ इसे सही करता है।

VB.NET में व्युत्पन्न वर्गों के लिए इसे आसानी से सुलभ बनाने के लिए, एक और नामकरण सम्मेलन के साथ आना होगा। अंडरस्कोर को उपसर्ग करना शायद कम से कम घुसपैठ और उनमें से सबसे "ऐतिहासिक रूप से स्वीकृत" है।


0

अब इस "as" के रूप में "।" का उपयोग करके संकेतन C # वर्ग सदस्य चर के लिए स्वीकार्य है। यह पुराने "m_" या सिर्फ "__" अंकन को प्रतिस्थापित करता है। यह कोड को अधिक पठनीय बनाता है क्योंकि इसमें कोई संदेह नहीं है कि संदर्भ क्या है।


0

मेरे अनुभव (निश्चित रूप से सीमित) से, एक अंडरस्कोर इंगित करेगा कि यह एक निजी सदस्य चर है। जैसा कि गोलम ने कहा, यह टीम पर निर्भर करेगा, हालांकि।


0

पुराना प्रश्न, नया उत्तर (C #)।

C # के लिए अंडरस्कोर का एक और उपयोग ASP NET Core के DI (निर्भरता इंजेक्शन) के साथ है। readonlyएक वर्ग के निजी चर जो निर्माण के दौरान इंजेक्शन इंटरफ़ेस को सौंपा गया है, एक अंडरस्कोर के साथ शुरू होना चाहिए। मुझे लगता है कि यह एक बहस है कि क्या किसी वर्ग के प्रत्येक निजी सदस्य के लिए अंडरस्कोर का उपयोग करना है (हालांकि Microsoft स्वयं इसका अनुसरण करता है) लेकिन यह निश्चित है।

private readonly ILogger<MyDependency> _logger;

public MyDependency(ILogger<MyDependency> logger)
{
    _logger = logger;
}

-2

इस तरह एक नामकरण सम्मेलन उपयोगी है जब आप कोड पढ़ रहे हैं, विशेष रूप से कोड जो आपका अपना नहीं है। एक मजबूत नामकरण सम्मेलन यह इंगित करने में मदद करता है कि किसी विशेष सदस्य को कहां परिभाषित किया गया है, वह किस प्रकार का सदस्य है, आदि। अधिकांश विकास दल एक साधारण नामकरण सम्मेलन को अपनाते हैं, और केवल एक अंडरस्कोर ( _fieldName) के साथ सदस्य उपसर्ग फ़ील्ड बनाते हैं । अतीत में, मैंने C # के लिए निम्नलिखित नामकरण सम्मेलन का उपयोग किया है (जो .NET फ्रेमवर्क कोड के लिए माइक्रोसोफ्ट कन्वेंशन पर आधारित है, जिसे रिफ्लेक्टर के साथ देखा जा सकता है):

इंस्टेंस फील्ड: m_fieldName
स्टेटिक फील्ड: s_fieldName
सार्वजनिक / संरक्षित / आंतरिक सदस्य: PascalCasedName ()
निजी सदस्य: camelCasedName ()

यह अपरिचित कोड को बहुत तेज़ी से पढ़ने पर लोगों की संरचना, उपयोग, पहुंच और सदस्यों के स्थान को समझने में मदद करता है।


3
दरअसल, Microsoft m_, s_ उपसर्गों का उपयोग करने की अनुशंसा नहीं करता है। फ़ील्ड नामों के लिए एक उपसर्ग का उपयोग न करें। उदाहरण के लिए, स्थैतिक बनाम गैर-स्थिर क्षेत्रों को अलग करने के लिए g_ या s_ का उपयोग न करें। msdn.microsoft.com/en-us/library/ms229012.aspx
Zied

1
जैसा कि मैंने कहा, रिफ्लेक्टर के साथ उनके स्रोत कोड पर एक नज़र डालें। आपको आश्चर्य होगा कि वे अपनी खुद की सिफारिशों को कितना ढालते हैं। ;) जैसा कि मेरी पोस्ट में उल्लेख किया गया है, यह आपके कोड की पठनीयता में सुधार करने में मदद करता है, और मेरी पिछली टीम को ऊपर सूचीबद्ध नामकरण सम्मेलन वास्तव में पसंद आया।
वृथा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.