मैं "var" नाम की क्लास क्यों बना सकता हूँ?


103

varC # में एक कीवर्ड नहीं है? लेकिन मैं ऐसा क्यों कर सकता हूं:

public class var { }

public class main
{
    public static void main(string[] args)
    {
        var testVar = new var();
    }
}

इसका varउपयोग उस कोड में किया जाता है जो varकक्षा से पहले घोषित किया जाता है main। और कंपाइलर भी शिकायत नहीं करता है।

जब मैं ऐसा करता हूं:

public class int { }

या यह:

public class true { }

संकलक ने कहा कि intया trueएक खोजशब्द है और उसका उपयोग नहीं किया जा सकता है। ऐसा क्यों नहीं है var?


6
आपको क्यों चाहिए होगा? इतना भ्रामक और पढ़ने में कठिन।
डफिमो


31
अच्छा सवाल!
रिचर्ड

50
आप var var = "var";एक विधि में भी कर सकते हैं । आखिरकार, यह शुक्रवार है।
हेंक होल्टरमैन

11
मुझे लग रहा है कि उन्होंने इसे इस तरह बनाया कि कोड के साथ पिछड़े संगत होने से पहले "var" का मतलब कुछ खास था।
vidstige

जवाबों:


101

varइस सूची के अनुसार कोई कीवर्ड नहीं है ।

यह एक प्रासंगिक कीवर्ड है, इसलिए संदर्भ से कंपाइलर यह तय करने में सक्षम है कि कौन सा आपकी कक्षा है और कौन सा प्रासंगिक कीवर्ड है, और कोई भ्रम उत्पन्न नहीं होता है।

एक प्रासंगिक कीवर्ड है:

कोड में एक विशिष्ट अर्थ प्रदान करने के लिए उपयोग किया जाता है, लेकिन यह C # में आरक्षित शब्द नहीं है।

इसलिए इसके आरक्षित नहीं होने के कारण आप इसका उपयोग कर सकते हैं।

जैसा कि ऊपर टिप्पणियों में बताया गया है कि मतभेदों की चर्चा के साथ-साथ एरिक लिपर्ट ब्लॉग पर c # के प्रत्येक संस्करण में जोड़े गए विभिन्न कीवर्ड और प्रासंगिक कीवर्ड की एक सूची है।

यह ध्यान रखना दिलचस्प है कि चूंकि कीवर्ड के सेट को C # 1.0 में तय किया गया था, इसलिए इसमें कोई जोड़ नहीं हैं, ताकि आगे की संगतता को संरक्षित किया जा सके।


1
हालाँकि इसे "C # कीवर्ड" के अंतर्गत msdn.microsoft.com/en-us/library/bb383973.aspx ... भ्रामक के तहत वर्गीकृत किया गया है!
रिचर्ड

4
लेकिन यह ए Contextual Keyword"एक प्रासंगिक कीवर्ड का उपयोग कोड में एक विशिष्ट अर्थ प्रदान करने के लिए किया जाता है, लेकिन यह C # में एक आरक्षित शब्द नहीं है । कुछ प्रासंगिक कीवर्ड, जैसे कि आंशिक और जहां, दो या अधिक संदर्भों में विशेष अर्थ रखते हैं।"
टिम श्मेल्टर

5
@TimSchmelter फिर "var" एक "कीवर्ड" है। सिर्फ एक "आरक्षित शब्द" नहीं, सही?
लुइसुबल

2
मुझे लगता है कि यह पुराने कोड के साथ संगतता बनाए रखने के लिए है - अगर किसी का नाम एक वर्ग था varतो C # अपग्रेड करते समय सब कुछ नहीं टूटता।
कैलम रोजर्स

1
@CallumRogers: कि वास्तव में क्यों सी # टीम ऐसा किया। अन्य के लिए समान बाद में "कीवर्ड" पेश किए गए, जैसे शामिल हों आदि (वैसे सभी प्रासंगिक)।
हाबिल

18

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


मुझे लगता है कि यह उत्तर कम से कम कुछ भ्रामक है। कंपाइलर यह निर्धारित करने के लिए बिल्कुल "स्मार्ट पर्याप्त" नहीं varहै कि कोड जैसे कीवर्ड के रूप में उपयोग किया जा रहा है या नहीं var testVar = new var();। हां, संदर्भ, नाम varमें एक कस्टम प्रकार परिभाषित किया गया था या नहीं, इसके संदर्भ में , इसमें खेला जाता है, लेकिन यह ठीक है क्योंकि संकलक उन मामलों में पर्याप्त स्मार्ट नहीं है, जो यह जानते हैं कि var testVarकक्षा को संदर्भित करता है varया उस कीवर्ड को varजो इसे कक्षा में डिफॉल्ट करता है। इस तरह के संदर्भ में। varअलग-अलग नाम के कीवर्ड थे , इसे बहुत ही "संदर्भ" में इस्तेमाल किया जा सकता था।
या मैपर

इसके विपरीत, जैसे कि अन्य प्रासंगिक कीवर्ड, जैसे add- यहां, कंपाइलर वास्तव में हर घटना पर जानता है कि क्या कीवर्ड का मतलब है (घटना की घोषणा; पहचानकर्ता वहां कोई मतलब नहीं होगा), या क्या कोड पहचानकर्ता का उल्लेख कर रहा है (प्रकार या) एक घोषणा में नाम, एक विधि निकाय के भीतर पहचानकर्ता का उपयोग; कीवर्ड का कोई मतलब नहीं होगा)।
या मैपर

12

इसे देखने का दूसरा तरीका: एक कीवर्ड के रूप में "var" C # ("int" और "true" के विपरीत) के पहले संस्करणों में नहीं था, इसलिए आपने कुछ कोड लिखे होंगे, जिसमें "var" नामक एक वर्ग था। यह पूरी तरह से ठीक और कानूनी था। फिर बाद में जब भाषा में "var" जोड़ा गया, तो डिज़ाइनर इतने दयालु थे कि इसे केवल कुछ संदर्भों में एक कीवर्ड बनाने के लिए, इसलिए आपका मौजूदा var क्लास अभी भी काम करेगा।

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


8

संस्करण 3 से पहले सी # संस्करणों में, अनुमानित रूप से टाइप किए गए स्थानीय चर अभी तक समर्थित नहीं थे, इसलिए varइसका कोई विशेष अर्थ नहीं था और नामांकित चर और वर्गों को परिभाषित करना संभव था var। आपका उदाहरण कार्यक्रम कानूनी है, क्योंकि दोनों वर्ग के संदर्भ varमें हैं ।mainvar

C # 3 और बाद के संस्करण नीचे की ओर संगत हैं, इसलिए संस्करण 3 से पहले C # में लिखे गए कोड अभी भी नए संकलक के साथ संकलित हैं।

intऔर trueC # 1 के बाद से कीवर्ड हैं।


3

कीवर्ड को प्रासंगिक रूप से आरक्षित किया जा सकता है। जब स्रोत कोड पार्स किया जाता है, तो उस संदर्भ को पार्स ट्री के हिस्से के रूप में स्थापित किया जाता है। उस संदर्भ में खोजशब्दों का मूल्यांकन होता है। इसलिए, इस मामले में, var एक आरक्षित संदर्भ में नहीं है और इसका कोई अर्थ नहीं होगा जब आप इसे असाइनमेंट स्टेटमेंट में उपयोग कर रहे हैं। मेरा मानना ​​है कि इस लचीलेपन का एक कारण यह है कि var को C # 3 में पेश किया गया था, इसलिए इसे हर जगह आरक्षित बनाने से कुछ कार्यक्रमों में पीछे की ओर की संगतता टूट सकती है, जबकि इसे एक चर प्रकार की घोषणा के रूप में उपयोग करने से पहले के संस्करणों में संकलित नहीं किया जाता है, इसलिए ऐसा नहीं है टूटना।

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