2012-05-11 14 views
101

var सी # में कोई कीवर्ड नहीं है? लेकिन मैं ऐसा क्यों कर सकते हैं:मैं "var" नामक कक्षा क्यों बना सकता हूं?

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

आप क्यों चाहेंगे? तो भ्रमित और पढ़ने के लिए मुश्किल है। – duffymo

+0

'गतिशील' कीवर्ड के बारे में क्या? क्या इसका इस्तेमाल भी किया जा सकता है? –

+6

इसे पढ़ें: http://blogs.msdn.com/b/ericlippert/archive/2009/05/11/reserved-and-contextual-keywords.aspx – AakashM

उत्तर

101

var कोई कीवर्ड according to this list नहीं है।

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

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

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

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

के रूप में टिप्पणी में कहा ऊपर वहाँ Eric Lipperts blog

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

+1

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

+4

लेकिन यह एक ['प्रासंगिक कीवर्ड '] है (http://msdn.microsoft.com/en-us/library/x53a06bb.aspx)। _ "एक प्रासंगिक कीवर्ड का उपयोग कोड में एक विशिष्ट अर्थ प्रदान करने के लिए किया जाता है, लेकिन यह ** सी # ** में एक आरक्षित शब्द नहीं है। कुछ प्रासंगिक कीवर्ड, जैसे आंशिक और कहां, दो या दो से अधिक संदर्भों में विशेष अर्थ हैं।" _ –

+5

@TimSchmelter फिर "var" एक "कीवर्ड" है। बस एक "आरक्षित शब्द" नहीं, है ना? – luiscubal

18

संकलक बहुत चालाक पता चला है कि संदर्भ आप एक वर्ग नाम के रूप में प्रयोग कर रहे हैं var कीवर्ड के लिए एक संदर्भ कभी नहीं है तो (यही कारण है कि एक contextual keyword के रूप में परिभाषित किया गया है) यह अनुमति देता है।

+0

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

+0

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

8

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

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

int और true के बाद से सी # 1.

12

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

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

3

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

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