कीवर्ड 'var' का उपयोग करके चर डेटा प्रकारों को स्पष्ट रूप से परिभाषित करना? [बन्द है]


35

C # में, क्या मुझे हर चर घोषणा के लिए सर्व-उद्देश्यीय var कीवर्ड का उपयोग करने के लिए प्रोत्साहित किया जाता है? यदि हाँ, तो मुझे निम्नलिखित कथन में दशमलव के लिए एम की तरह चर घोषणा के भीतर शाब्दिक मूल्यों के लिए उन विशेष वर्णों का उल्लेख करना होगा:

var myDecimal = 14.5M;

अगर इससे कोई फर्क पड़ता है, तो मैं C # के साथ कुछ वेब डेवलपमेंट करने की कोशिश कर रहा हूं।


7
एसओ (जहां यह आईएमएचओ का है) पर एक दर्जन से अधिक ठगी हुई है।

1
C ++ 0x के पुनरुत्थान के साथ C ++ में वही प्रश्न आ रहे हैं auto
डेविड थॉर्नले

5
C # कंपाइलर टीम के एरिक लिपर्ट
टिम गुडमैन

इस सवाल के छह बिलियन डुप्लिकेट हैं।
डेडएमजी नोव

@DeadMG जो छह बिलियन और एक बनाता है।
५:५० पर शिमसान

जवाबों:


53

Var के उपयोग पर बहुत विवाद हुआ है। मेरे सामान्य नियम निम्नलिखित हैं।

  • जब प्रकार स्पष्ट होता है जैसे कि असाइनमेंट का दाहिना हाथ एक निर्माता है, तो var का उपयोग करें।
  • जब टाइप लिखने के लिए जटिल होता है, जैसे कि LINQ क्वेरी (पहली जगह में var का कारण) var का उपयोग करें।
  • अस्पष्ट प्रकारों के लिए (आपका दशमलव एक उदाहरण है) जहां आप यह सुनिश्चित करना चाहते हैं कि आपका चर सही ढंग से टाइप किया गया है, इसे वर्तनी दें।
  • अनाम प्रकारों को var का उपयोग करना होता है।
  • अन्य सभी मामलों में टाइप करें।

मूल रूप से, लक्ष्य कोड को पढ़ना आसान बनाना है। यदि आपको लगता है कि var पर्याप्त है क्योंकि असाइनमेंट स्पष्ट है, तो var का उपयोग करें। जब आपको लगता है कि यह आवश्यक है तो पाठक के लिए एक संकेत के रूप में पूर्ण प्रकार के नाम का उपयोग करें।


9
मैं उन foreachबयानों में भी 'var' का उपयोग करता हूं जहां मुझे केवल एक संग्रह की गणना करने की परवाह है, जरूरी नहीं कि प्रत्येक आइटम के प्रकार के बारे में।
एडम लेअर

1
और जैसा कि जेसी ने गुमनाम प्रकार बताया;)
माइकल ब्राउन

4
@AnnaLear कभी-कभी आपको हालांकि देखभाल करनी होती है। foreach (var row में datatable.Rows) इस मामले में var एक ऑब्जेक्ट है जो DataRow नहीं है जैसा कि कोई अपेक्षा करेगा।
थानोस पापनाथनियोउ

@ थनोसपथनतिसौ ज़रूर, हाँ। समान रूप से विंडोज फॉर्म और शायद अन्य स्थितियों में भी नियंत्रण संग्रह के लिए चला जाता है।
एडम लेअर

जब मैं अपने वेरिएबल के प्रकार के बारे में सुनिश्चित होना चाहता हूं (जैसे कि जब मैं यह सुनिश्चित करना चाहता हूं कि उदाहरण के लिए मूल्य दोगुना है) को छोड़कर आमतौर पर मैं var का उपयोग करता हूं
eka808

14

जब उपयोग करने के लिए varएक प्रोग्रामिंग "पवित्र युद्ध" है। ठीक एक जगह है जहाँ इसकी आवश्यकता होती है: जब एक ऑपरेशन का परिणाम एक अनाम प्रकार बनाता है, जैसे:

var result = new { Name = "John", Age = 35 };

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

और हां, आपको कंपाइलर्स को यह बताने के लिए विशेष वर्णों की आवश्यकता होगी कि वह दाईं ओर क्या है। आपके उदाहरण में, Mडिफ़ॉल्ट के doubleबजाय , डिफ़ॉल्ट के बजाय है decimal


1
अनाम प्रकारों के बारे में सब भूल गए!
माइकल ब्राउन

अपनी आखिरी नौकरी में मुझे बताया गया था कि अगर मैं "var" कीवर्ड का उपयोग करता रहा तो मुझे निकाल दिया जाएगा ...
hanzolo

यह चरम है, लेकिन आपकी कंपनी की पहल है। खुशी है कि यह आपकी "अंतिम" नौकरी है, हालांकि! :)
जेसी सी। स्लीपर

7

MSDN से :

हालाँकि, अन्य डेवलपर्स के लिए आपके कोड को समझने में अधिक कठिन बनाने के लिए var के उपयोग में कम से कम क्षमता है। उस कारण से, C # प्रलेखन आम तौर पर केवल तभी var का उपयोग करता है जब इसकी आवश्यकता होती है।

मुझे वास्तव में, वास्तव में अंतर्निहित टाइपिंग पसंद नहीं है। सतह पर यह कोड को अधिक पठनीय बनाने के लिए जाता है, लेकिन सड़क के नीचे बहुत सारी समस्याएं पैदा कर सकता है। यदि कोई देव एक वैरिएबल इनिशियलाइज़र को बदलता है, तो कहो, से

var myFloat=100f;

सेवा मेरे

var myFloat=100;

या

var myFloat=100.0;

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

अंतर्निहित टाइपिंग भी हर जगह (एक ही MSDN लिंक से) काम नहीं करती है

var का उपयोग केवल तब किया जा सकता है जब एक स्थानीय चर घोषित किया जाता है और एक ही कथन में आरंभ किया जाता है; चर को शून्य, या विधि समूह या अनाम फ़ंक्शन के लिए प्रारंभ नहीं किया जा सकता है।

var का उपयोग फ़ील्ड स्कोप पर फ़ील्ड में नहीं किया जा सकता है।

Var का उपयोग करके घोषित चर का उपयोग इनिशियलाइज़ेशन एक्सप्रेशन में नहीं किया जा सकता है। दूसरे शब्दों में, यह अभिव्यक्ति कानूनी है: int i = (i = 20); लेकिन यह अभिव्यक्ति एक संकलन-समय त्रुटि पैदा करती है: var i = (i = 20);

एकाधिक निहित-टाइप किए गए चर को एक ही कथन में प्रारंभ नहीं किया जा सकता है।

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

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

2017 अपडेट

मैंने पूरी तरह से अपना विचार बदल दिया। C # में काम varकरते समय , मैं ज्यादातर समय का उपयोग करता हूं (इंटरफ़ेस-प्रकार चर और इस तरह की चीजों को छोड़कर)। यह कोड की प्रवृत्ति रखता है जो पठनीयता में सुधार करता है। फिर भी, हालांकि - ध्यान दें कि वास्तव में हल प्रकार क्या है।


आश्चर्य है कि क्या आपका मन बदल गया, @ 3Dave। मैं अभी भी 100% आपके मूल बिंदु से सहमत हूं: "var आलसी है और कोई वास्तविक लाभ प्रदान नहीं करता है, और पहले से ही जटिल प्रक्रिया में विफलता का एक और संभावित बिंदु पेश करता है"।
दान

@ क्या यह वास्तव में पठनीयता में कमी आई है। एक सक्षम डेवलपर बहुत जल्दी यह निर्धारित कर सकता है कि बिना किसी घोषणा के प्रारंभिककरण पक्ष पर क्या है। जैसे this.हर जगह का उपयोग नहीं करना , या System.Blah.SomeTypeइसके बजाय कहना using, जो मुझे अभी भी अविश्वसनीय रूप से कष्टप्रद लगता है, अधिक कठिन कोड है - कम से कम मेरे लिए - आम तौर पर नेत्रहीन पार्स के लिए आसान है। अभी भी कई परिदृश्य हैं जहां स्पष्ट टाइपिंग सही विकल्प है। लेकिन, इन दिनों मैं किसी भाषा के वकील की तुलना में कम हूं, जो सिर्फ दरवाजे से साफ कोड निकालने की कोशिश कर रहा है।
3Dave

@ (निश्चित रूप से, मैं भी उस आदमी का उपयोग कर रहा हूँ using namespace std;.cpp फ़ाइलें। (हेडर नहीं है, जैसा कि मैं
तारांकित

3

C # संदर्भ इस निर्माण के अच्छे बनाम बुरे उपयोग को दर्शाने के लिए निम्नलिखित दिखाता है:

निम्न उदाहरण दो क्वेरी भाव दिखाता है। पहली अभिव्यक्ति में, var के उपयोग की अनुमति है, लेकिन इसकी आवश्यकता नहीं है, क्योंकि क्वेरी परिणाम का प्रकार स्पष्ट रूप से IEnumerable के रूप में कहा जा सकता है। हालांकि, दूसरी अभिव्यक्ति में, var का उपयोग किया जाना चाहिए क्योंकि परिणाम अनाम प्रकारों का एक संग्रह है, और उस प्रकार का नाम संकलक को छोड़कर सुलभ नहीं है। ध्यान दें कि उदाहरण # 2 में, foreach iteration variable आइटम को भी स्पष्ट रूप से टाइप किया जाना चाहिए।

 // Example #1: var is optional because 
    // the select clause specifies a string 
    string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
    var wordQuery = from word in words
                    where word[0] == 'g'
                    select word;

    // Because each element in the sequence is a string,  
    // not an anonymous type, var is optional here also. 
    foreach (string s in wordQuery)
    {
        Console.WriteLine(s);
    }

    // Example #2: var is required because 
    // the select clause specifies an anonymous type 
    var custQuery = from cust in customers
                    where cust.City == "Phoenix" 
                    select new { cust.Name, cust.Phone };

    // var must be used because each item  
    // in the sequence is an anonymous type 
    foreach (var item in custQuery)
    {
        Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
    }

0

Var कीवर्ड केवल कंपाइलर से वेरिएबल वेरिएबल के प्रकार को कम करने का अनुरोध करता है। इसलिए, यदि आप एक दशमलव चर में दशमलव प्रकार चर को स्टोर करना चाहते हैं, तो आपको मी का उपयोग करने की आवश्यकता है। इसी तरह यदि आप एक स्ट्रिंग संग्रहीत कर रहे हैं तो आपको इसे उद्धरण में संलग्न करने की आवश्यकता है।


0

मेरे लिए मैं निम्नलिखित मामलों के लिए var का उपयोग नहीं करता:

  • जब मैं अपने वेरिएबल के प्रकार के बारे में सुनिश्चित होना चाहता हूं (उदाहरण के लिए सुनिश्चित करें कि उपयोग किया जाने वाला प्रकार डबल है और दशमलव नहीं है, और यह मेरे लिए एक बड़ा सौदा है!)
  • बहुरूपी कोड की तरह Fruit foo = new Apple();। इस मामले में, मुझे लगता है कि वेरिएंट को पेरेंट क्लास से बचना और उसका उपयोग करना है (यहाँ फ्रूट) कोड लॉजिक की बेहतर समझ और संभावित बग्स को सीमित करने की अनुमति देकर बेहतर है (var के साथ, पॉलीमॉर्फिक कॉन्सेप्ट का कोई चेक नहीं!)।

बाकी के लिए, मुझे लगता है कि यह मामले और डेवलपर की पृष्ठभूमि पर निर्भर करता है। PHP की दुनिया के कुछ लोग वैरिएबल प्रकारों की देखभाल नहीं करना पसंद करेंगे, और जावा दुनिया के कुछ लोग बस सोचेंगे कि var एक विधर्मी है और यह जितना अधिक क्रिया है उतना ही बेहतर है।

आपको अपनी निजी राय बनानी होगी :)

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