2010-09-11 24 views
10

MSDNvarTypes के अंतर्गत वर्गीकृत करता है।var: एक प्रकार या एक कीवर्ड

चर कि विधि दायरे में घोषित किया गया है एक अंतर्निहित प्रकार वर

'निहित प्रकार var' इस संदर्भ में क्या मतलब है हो सकता है?

कड़ाई से कहा, अगर मुझे साथी प्रोग्रामर को समझाया जाए तो।

क्या मैं कह सकता हूं; var टाइप, या मुझे कहना है; var कीवर्ड है जो संकलक को स्वयं निर्धारित करने के लिए निर्देश देता है।

नोट: यह var के बारे में चर्चा शुरू करने के लिए नहीं है, न ही var के उपयोग को सीखना है। एक बार और सभी के लिए मैं जानना चाहता हूं कि इसका वर्णन कैसे किया जाए और msdn थोड़ा उलझन में है, यही वह है।

उत्तर

14

var एक contextual keyword है - yield, add और get उदाहरण के लिए के साथ।

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

स्थानीय चर घोषित करने के लिए var का उपयोग करके कंपाइलर को infer दाएं हाथ की अभिव्यक्ति के आधार पर चर के प्रकार से पूछता है। उदाहरण के लिए:

var list = new List<string>(); 
var anon = new { Foo = "bar" }; 

list के प्रकार List<string> है; anon का प्रकार अज्ञात प्रकार है, जिसे सी # 3 में भी पेश किया गया है। सी # 3 में var को शुरू करने के कारण का कारण अज्ञात प्रकारों का उपयोग करके दृढ़ता से टाइप किए गए चर के लिए अनुमति देना था - चर के पास अभी भी उचित संकलन-समय का प्रकार है, यहां तक ​​कि चर हालांकि आप उस प्रकार को स्पष्ट रूप से नहीं बता सकते थे।

वहाँ, कुछ मामलों में जहां var काम नहीं करता है लेकिन यदि संकलक पर्याप्त जानकारी नहीं है:

var cantUseNull = null; 
var cantUseLambda = x => x.Length; 

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

<plug>
आप C# in Depth में इसके बारे में अधिक पढ़ सकते हैं। सौभाग्य से, यह कवर करने वाला अध्याय अभी भी first edition page से मुक्त है (आप अध्याय 8 चाहते हैं)। मुझे याद नहीं है कि मैंने इस संस्करण को दूसरे संस्करण में कितना बदल दिया है ...
</plug>

+0

और क्या आप कृपया मुझे बता सकते हैं कि एमएसडीएन आलेख में 'अंतर्निहित प्रकार var' का अर्थ क्या है? बिट यहां अनुवाद में खो गया;) सवाल को थोड़ा सा संपादित किया गया, आप बहुत तेज़ ... –

+0

@ कैस्पर: इसका मतलब है कि आप चर के प्रकार की घोषणा करने के लिए 'var' का उपयोग कर सकते हैं, इस मामले में चर के संकलन-समय प्रकार दाईं तरफ अभिव्यक्ति का प्रकार है। –

+1

प्रारूपण को खोना महत्वपूर्ण नहीं है, यह 'अंतर्निहित प्रकार ** var **' है। वर एक अंतर्निहित टाइपिंग है जिसमें वास्तविक प्रकार को संकलक द्वारा निर्धारित किया गया है, जिसे 'var i = 10;', स्पष्ट रूप से टाइप किए गए चर के विपरीत, यानी 'int i = 10;' वास्तव में लागू का अर्थ है निहित या अनुमानित प्रकार। क्या उससे मदद हुई? – Lazarus

0

यह दोनों का थोड़ा सा है। तकनीकी रूप से, var का उपयोग करते समय, चर को दृढ़ता से टाइप किया जाता है, लेकिन संकलक प्रकार निर्धारित करता है।तो मैं कहूंगा कि 'var is a type' कहकर आप निकटतम होंगे।

0

वर तरह पूर्णांक, एक प्रकार है ... लेकिन क्या प्रकार यह वास्तव में है ??

ठीक है, संकलक शेष लाइन के आधार पर आपके लिए बाहर काम करता है (जो कि इसका अर्थ है)।

उदा।

var b = "ahjhsad"; 

संकलन समय, वरस्ट्रिंग से बदल दिया जाएगा।

वर, बजाय होने के

List<string> myList = new List<string>(); 

लिखने के लिए एक प्रोग्रामर

var myList = new List<string>(); 

लिख सकते हैं प्रोग्रामर के लिए एक सुविधाजनक कम हाथ के रूप में प्रयोग किया जाता है और यह एक ही बात का मतलब है।

+0

डैंग, आप स्कीट को हरा नहीं सकते ... – CVertex

+0

" एक प्रकार क्या है, बिल्कुल? " एक अच्छा सवाल है। सी # विनिर्देश वास्तव में * शब्द "प्रकार" परिभाषित नहीं करता है। यह आपको लगता है कि एक क्या है! –

11

मैं कह सकते हैं वर एक प्रकार है, या मैं कहना वर एक कीवर्ड कि संकलक प्रकार निर्धारित करने के निर्देश देता है क्या ज़रूरत है?

यह इस बात पर निर्भर करता है कि आप इसे कैसे देखते हैं। गंभीरता से!

सी # कंपाइलर कार्यक्रमों पर तीन प्रकार के विश्लेषण करता है, प्रत्येक बाद के विश्लेषण पिछले एक के परिणाम का उपभोग करते हैं। हम पहले प्रकार के विश्लेषण लेक्सिकल विश्लेषण करते हैं; हम पाठ लेते हैं और इसे टोकन की एक श्रृंखला में बदल देते हैं। मान लीजिए आपके पास

class C { static void Main(){ var x = 123; } } 

हम पहले यह निर्धारित है कि उन टोकन वर्ग पहचानकर्ता (सी) LEFTBRACE static void पहचानकर्ता (मुख्य) LEFTPAREN RIGHTPAREN LEFTBRACE IDENTIFIERTHATMIGHTBEAKEYWORD (वर) पहचानकर्ता (एक्स) के बराबर है पूर्णांक (123) SEMICOLON RIGHTBRACE RIGHTBRACE हैं।

विश्लेषण के इस चरण में, "var" उस पर एक नोट के साथ एक पहचानकर्ता है जो कहता है कि यह कीवर्ड var हो सकता है, पहचानकर्ता var नहीं।

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

declaration of class: CLASS 
    class name: IDENTIFIER(C) 
    class body begins: LEFTBRACE 
    declaration of method: 
     method modifier: STATIC 
     return type: VOID 
     method name: IDENTIFIER(Main) 
     formal parameter declarations: 
      formal parameter declarations begin: LEFTPAREN 
      formal parameter declarations end: RIGHTPAREN 
     method body: 
      method body begins: LEFTBRACE 
      local declaration statement: 
       type: IDENTIFIERTHATMIGHTBEAKEYWORD(var) 
       local name: IDENTIFIER(x) 
       initializer: 
       assignment operator: EQUALS 
       integer literal expression: INTEGER(123) 
       statement ends: SEMICOLON 
      method body ends: RIGHTBRACE 
    class body ends: RIGHTBRACE 

(खरोज पेड़ में नेस्टिंग स्तर इंगित करता है)। यह जगह पर हम एक प्रकार की घोषणा की उम्मीद करेंगे यदि यह एक व्याकरणिक कानूनी कार्यक्रम है।

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

जब हम पार्स पेड़ का अर्थपूर्ण विश्लेषण करते हैं तो हम कहते हैं, "ठीक है, एक कक्षा सी है, यह एक विधि मुख्य है, जो स्थानीय चर एक्स की घोषणा करता है। उस स्थानीय चर का प्रकार क्या है?"

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

यदि हमें कोई मिलता है, तो "var" उस प्रकार को संदर्भित करता है।

यदि हमें कोई नहीं मिलता है तो हम मानते हैं कि "var" का उपयोग प्रासंगिक कीवर्ड के रूप में किया जा रहा है जो एक स्पष्ट रूप से टाइप किए गए स्थानीय को प्रस्तुत करता है।

तो, आपके सवाल का जवाब देना:

lexically, कोड टुकड़ा "var" इस पर एक टिप्पणी है कि कहते हैं, "वैसे, यह वास्तव में एक कीवर्ड हो सकता है" के साथ एक पहचानकर्ता टोकन है।

याकरण, टोकन "var" जब यह व्याकरण जहां एक प्रकार की उम्मीद है में एक पद पर प्रकट होता है एक प्रकार है।

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

+0

उत्तर के लिए धन्यवाद, मैंने वास्तव में देखा है कि सार्वजनिक वर्ग var {} आपके द्वारा वर्णित विभिन्न कीवर्ड को ओवरराल करता है, इसलिए आपकी स्पष्टीकरण वास्तव में मुझे समझ में आता है, धन्यवाद! पीएस: क्या इसका मतलब है कि मुझे जॉन को हटाना है? ;) –

+0

और कोड IDENTIFIERTHATMIGHTBEAKEYWORD वह चीज है जो यह करता है, कि var x = 123 में, var एक कीवर्ड –

+0

हो सकता है मुझे नहीं पता था कि आप एक प्रकार 'var' बना सकते हैं जो कीवर्ड को ओवरराइड करेगा, लेकिन मुझे लगता है कि यह है पिछड़े संगतता को संरक्षित करने के लिए आवश्यक है। जिज्ञासा से, क्या अभी भी एक शब्द के रूप में 'var' का उपयोग करने का कोई तरीका है, भले ही ऐसा कोई प्रकार गुंजाइश हो? –

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