ReSharper हर चीज के लिए 'var' का उपयोग क्यों करना चाहता है?


214

मैंने अभी-अभी Visual Studio के साथ ReSharper (SO पर कई सिफारिशों के बाद) का उपयोग करना शुरू किया है। इसे आज़माने के लिए मैंने हाल ही में ASP.NET MVC प्रोजेक्ट खोला। पहली और सबसे लगातार चीजों में से एक जो मैंने देखा है कि यह सुझाव है कि varइसके बजाय मेरी / सभी स्पष्ट घोषणाओं को बदलना है । उदाहरण के लिए:

//From This:
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
//To This:
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);

और इतने पर, यहां तक कि साधारण प्रकार के रूप में इस तरह के साथ int, boolआदि

इसकी सिफारिश क्यों की जा रही है? मैं कंप्यूटर साइंस या .NET बैकग्राउंड से नहीं आता, "हाल ही में" .NET विकास में गिर गया है, इसलिए मैं वास्तव में यह समझना चाहता हूं कि क्या चल रहा है और यह लाभ का है या नहीं।



27
मैं कुछ समय के लिए इस बारे में सोच रहा था और मैं इस निष्कर्ष पर पहुंचा कि मुझे हमेशा उपयोग करना चाहिए var, तब भी जब प्रकार बिल्कुल स्पष्ट नहीं है! इसका कारण यह है कि यह मुझे सबसे वर्णनात्मक नाम चुनने के लिए मजबूर करता है जिसके साथ मैं आ सकता हूं और आखिरकार यह कोड बहुत अधिक पठनीय बनाता है। अंततः यह तर्क को कार्यान्वयन से अलग करने में भी मदद करता है। बेशक यह सिर्फ मेरी राय है, मुझे उम्मीद है कि यह किसी की मदद करेगा;)।
मास्टर मैस्टिक

जवाबों:


189

एक कारण पठनीयता में सुधार है। कौनसा अच्छा है?

Dictionary<int, MyLongNamedObject> dictionary = new Dictionary<int, MyLongNamedObject>();

या

var dictionary = new Dictionary<int, MyLongNamedObject>();

260
मैं पहले वाला कहूंगा। क्या हो रहा है देखने के लिए आसान!
मोंगस पोंग

104
कवक: क्या आपको निरर्थक पाठ निरर्थक पाठ पसंद है? : D
मार्क सिम्पसन

73
स्पष्ट होना मेरी राय में अधिक स्पष्ट है। Var का उपयोग करना कुछ परिदृश्यों में सिरदर्द पैदा करता है।
user1231231412

172
जब डेवलपर्स varसब कुछ के लिए उपयोग करते हैं तो मैं इसे नफरत करता हूं - मैं टीएफएस (वेब ​​आधारित भिन्न) का उपयोग करके बहुत सारी और बहुत सारी कोड समीक्षा करता हूं और यह मेरे काम को बहुत कठिन बनाता है: अर्थात var items = GetSomeItems();बनाम IDataReader dr = GetSomeItems();दोनों पर बयान का उपयोग करना याद रखना लेकिन IDataReaderबनाम का उपयोग करते समय मुझे पकड़ना आसान है var
क्रिस गेसलर

17
यदि आप एक अच्छे डेवलपर हैं जो अच्छा कोड लिख रहे हैं, और आप एक पुस्तकालय जैसे कि Resharper का उपयोग कर रहे हैं, तो आपको उस स्पष्ट प्रकार को जानने की आवश्यकता नहीं है जो आपके साथ काम कर रहा है। ठीक उसी तरह जब आप किसी अनुबंध को घोषित करने के लिए इंटरफेस का उपयोग करते हैं, लेकिन एक ठोस वर्ग का नहीं, तो var आपको यह कहने की अनुमति देता है कि आपको परवाह नहीं है कि "प्रकार" क्या है, आप केवल इस बात की परवाह करते हैं कि यह क्या करता है, और अच्छी तरह से नामित चर का उपयोग करते हुए, Intelli-sense और resharper / VS हेल्पर्स (जैसे कि CTRL + CLICK के रूप में परिभाषा पर नेविगेट करने के लिए) आपको वहां 99% रास्ते मिलेंगे। इसके अतिरिक्त, यदि मैं एक विधि वापसी प्रकार बदलता हूं, तो इसका मतलब है कि var का उपयोग करके मुझे अपना कोड-आधार फिर से लिखना नहीं पड़ेगा।
जोशुआ बार्कर

286

ReSharper जो सुझाव देता है वह स्पष्ट रूप से var कीवर्ड का अति प्रयोग है। आप इसका उपयोग कर सकते हैं जहां प्रकार स्पष्ट है:

var obj = new SomeObject();

यदि प्रकार स्पष्ट नहीं है, तो आपको इसे लिखना चाहिए:

SomeObject obj = DB.SomeClass.GetObject(42);

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

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

18
@ जाको: +1, लेकिन यह उल्लेख के लायक है कि प्रकार के बारे में जानकारी चर नाम में होने की अनुशंसा नहीं की जाती है। उदाहरण के लिए, हंगेरियन नोटेशन को एक अच्छा अभ्यास नहीं माना जाता है।
रोमन बोइको डे

8
क्या ReSharper की डिफ़ॉल्ट सेटिंग्स एक अति प्रयोग हैं, varयह एक राय का विषय है, न कि "स्पष्ट रूप से" एक बात या कोई अन्य। मैं उन चीजों को टाइप नहीं करना पसंद करता हूं जो कंपाइलर अपने लिए समझ सकता है। मुझे C # टाइप इंट्रेंस पसंद है, और अक्सर कामना करता हूं कि यह F # टाइप इंट्रेंस के रूप में अच्छा हो। यदि मैं कर सकता था, तो मैं स्पष्ट रूप से विधि पैरामीटर और वापसी प्रकारों को छोड़ देता हूं, जैसा कि एफ # में आदर्श है। हर कोई इससे सहमत नहीं है, बिल्कुल।
जोएल मुलर

15
@AnonymousType: आप अभी भी बिंदु को याद कर रहे हैं। आपने कहा था कि विधि के नाम हमेशा विधि के इरादे को दर्शाते हैं, लेकिन फिर भी अगर वे ऐसा नहीं करते हैं तो इसका मतलब यह नहीं है कि नाम वापसी मूल्य के प्रकार को निर्दिष्ट करता है। Streamउदाहरण के लिए किसी ऑब्जेक्ट से पढ़ने की विधि का नाम है Read, नहीं ReadAndReturnNumberOfBytesAsInt32
गुफ़ा

99

मैं व्यक्तिगत रूप से इस सुझाव को बंद करना पसंद करता हूं। उपयोग करने से varअक्सर पठनीयता में सुधार हो सकता है; लेकिन जैसा कि आपने उल्लेख किया है, यह कभी-कभी इसे कम कर देता है (सरल प्रकारों के साथ, या जब परिणामी प्रकार अस्पष्ट होता है )।

जब मैं उपयोग करता हूं varऔर जब मैं नहीं करता हूं तो मैं चुनना पसंद करता हूं। लेकिन फिर, यह सिर्फ मुझे है।


11
मैंने सोचा था कि ReSharper का मतलब बहुत स्मार्ट था; यह जानने के लिए पर्याप्त स्मार्ट नहीं होना चाहिए कि परिणामी प्रकार स्पष्ट है (उदाहरण के लिए नए कीवर्ड के साथ कुछ भी) और जब यह स्पष्ट नहीं है?
असंतुष्टगीत

3
खैर, मैं इस सुविधा की ख़ासियत को नहीं जानता लेकिन, मुझे यकीन है कि मुझे पता है कि यह दिए गए सुझावों की मात्रा से अभिभूत था; और मैं varकाफी अक्सर उपयोग करता हूं ।
ब्रायन मेनार्ड

5
मुझे पता चला कि जब आप हमेशा var (जैसे कि resharper सुझाव) का उपयोग करते हैं, तो यह आपको अपने चर को ठीक से नाम देने के लिए मजबूर करता है।
सॉइलिल

क्या आप सुझाव को बंद कर सकते हैं?
क्रिस एस

@AngeDeLaMort: मुद्दा यह है कि यह आपको उन नामों का उपयोग करने के लिए मजबूर करता है जो अनुचित, fe हैं var methodXYResultIntArray। यह सभी कोडिंग मानकों के खिलाफ है और इससे कम संक्षिप्त है int[] methodXYResult। यदि आप byte[]भविष्य में विधि से वापस लौटना चाहते हैं तो आपके सभी चर नाम गलत हैं। स्पष्ट प्रकारों के साथ आप इसे बहुत आसानी से रिफ्लेक्टर कर सकते हैं। उपयोग करने के कारण हैं var, फ़े के साथ Dictionary<string, List<SomeType<int>>>। लेकिन अगर पूर्ण-प्रकार-नाम बहुत लंबा नहीं है और आप newदाईं ओर (या एक स्पष्ट कास्ट) रिसर्पर का उपयोग नहीं करते हैं, तो आपको यह सुझाव नहीं देना चाहिए।
टिम श्मेल्टर

69

varकोड की तत्काल समझ को कम करते हुए कोड की पठनीयता बढ़ा सकते हैं। बस उसी तरह, यह अन्य स्थितियों के लिए कोड की पठनीयता को कम कर सकता है। कभी-कभी इसका उपयोग तटस्थ होता है। समझ के लिए पठनीयता का माप आनुपातिक नहीं है, लेकिन स्थिति पर निर्भर करता है। कभी-कभी दोनों एक साथ बढ़ या घट जाते हैं।

कारक क्या है varके किया जा रहा है इसके डेटा प्रकार के लिए और कैसे अच्छी तरह से लक्ष्य का समर्थन करता है तत्काल कहानियो को लागू किया पाठक के लिए, या अपने प्रकार की जानकारी हाथ में कार्यक्रम भाग को समझने के लिए की आवश्यकता होगी।

उदाहरण के लिए, बुरा नामकरण varकोड की कमी के कारण पैदा कर सकता है । varहालांकि यह गलती नहीं है:

var value1 = GetNotObviousValue(); //What's the data type? 
//vs. 
var value2 = Math.Abs(-3); // Obviously a numeric data type. 

कभी-कभी यह varसरल डेटा प्रकारों के लिए उपयोग करने के लिए समझ में नहीं आता है जब इसकी अनुपस्थिति में कोड अधिक पठनीय होता है:

var num = GetNumber(); // But what type of number?
// vs. 
double num = GetNumber(); // I see, it's a double type. 

कभी-कभी varडेटा प्रकार की जानकारी को छिपाने के लिए उपयोगी हो सकता है जिसे आप आवश्यक नहीं समझते हैं:

    IEnumerable<KeyValuePair<string,List<Dictionary<int,bool>>>> q = from t in d where t.Key == null select t; // OMG! 
    //vs. 
    var q = from t in d where t.Key == null select t;

    // I simply want the first string, so the last version seems fine.  
    q.First().Key; 

जब कोई अनाम प्रकार मौजूद हो तो आपको इसका उपयोग करना होगाvar क्योंकि इसके द्वारा कॉल करने के लिए कोई प्रकार का नाम नहीं है:

var o = new { Num=3, Name="" };

जब आपके पास Visual Studio Intellisense प्रकार की जानकारी उपलब्ध कराने के बावजूद var, आपको तब बिना किसी सहायता के सख्त कोड रीडिंग के माध्यम से अपनी समझ पर कम भरोसा करना होगा। शायद यह मान लेना बुद्धिमानी है कि हर कोई Intellisense का उपयोग या उपयोग नहीं कर सकता है।

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

Resharper डिफ़ॉल्ट रूप से इसका उपयोग क्यों करता है? मैं आसानी के लिए सुझाव दूंगा, क्योंकि यह स्थितियों की बारीकियों को तय नहीं कर सकता है कि इसका उपयोग कब करना है।


5
IMHO आपके उदाहरण वास्तव में उपयोग करने के लिए अच्छे कारण हैं var, यह आपको सभ्य विधि नाम लिखने के लिए मजबूर करेगा। GetNumber() -but what type?- अच्छा, तुम क्यों परवाह करते हो? यदि यह जानना महत्वपूर्ण है GetNumberAsDouble(), तो विधि को कॉल करें , तो यह उतना ही स्पष्ट है और यदि आपके पास एक विधि है stringऔर एक वापसी है double
निकोडेमस 13

10
@ निकोडेमस 13 आप आम तौर पर जानते हैं कि आप किसी फ़ंक्शन के रिटर्न प्रकार के बारे में परवाह करते हैं जब आप वास्तव में रिटर्न मान का उपयोग करते हैं जब आप फ़ंक्शन स्वयं लिख रहे होते हैं। आपकी सुझाई गई नामकरण योजना GetResultsAsIEnumerableOfDouble की तरह दुरुपयोग को जन्म दे सकती है और यह सब ऐसा करता है कि आप असाइनमेंट के दाईं ओर var का उपयोग करके किसी असाइनमेंट के बाईं ओर से हटाए गए प्रकार की जानकारी को शिफ्ट करें।
एरिक

var value2 = Math.Abs ​​(-3); // स्पष्ट रूप से एक संख्यात्मक डेटा प्रकार। क्षमा करें, मैं इस पर असहमत हूं, पूरी तरह से, यह देखते हुए कि
एब्स

var सूक्ष्म तर्क त्रुटियों को भी जन्म दे सकता है जैसे: var काउंटर = "0"; जब आप चाहते हैं कि एक पूर्णांक है।
20

42

ReSharper (8.02, लेकिन संभावित रूप से अन्य संस्करणों) में, "पहले से टाइप किए गए स्थानीय चर घोषणा का उपयोग करें" सुझाव के विकल्प को अपनी प्राथमिकता में समायोजित किया जा सकता है , जो कुछ भी हो सकता है, पहले ReSharper के लिए विकल्प मेनू खोलकर:

ReSharper विकल्प मेनू

फिर, "केस इंस्पेक्शनिटी" को अपनी चुनी हुई भाषा के "निरीक्षण गंभीरता" को समायोजित करके "कोड इंस्पेक्शन" के तहत, मेरे मामले में c #:

अनुमानित रूप से टाइप किए गए स्थानीय चर सुझाव को बंद करें

जैसा कि आप देख सकते हैं, ReSharper द्वारा किए गए सभी सुझावों को समायोजित करने के लिए विकल्प हैं। आशा है कि यह मेरे जैसे किसी व्यक्ति की मदद करता है जिसके पास पहले से ही 'var' उपयोग की रणनीति है और वह चाहता है कि ReSharper इसका सम्मान करे :)


यह एक अलग सवाल का जवाब देता है जो बिल्कुल नहीं पूछा गया था।
कारल्स अल्केला

9
लेकिन यह उन कई लोगों के लिए प्रासंगिक है जो यहां मिलते समय इसकी तलाश करते हैं। +1
ओरच नाचम

24

मुझे आश्चर्य है कि किसी ने उल्लेख नहीं किया कि तात्कालिक वस्तु के प्रकार को बदलना भी आसान है, क्योंकि

AVeryLongTypeName myVariable = new AVeryLongTypeName( arguments );

पुनरावृत्ति का एक रूप है । अगर मैं AVeryLongTypeNameइसके व्युत्पन्न वर्गों में से एक में बदलना चाहता हूं, तो मुझे इसका उपयोग करते समय केवल एक बार बदलाव की आवश्यकता है varऔर अभी भी बच्चे कक्षाओं के तरीकों तक पहुंच सकते हैं।

इसके अलावा, बेहतर पठनीयता एक महत्वपूर्ण बिंदु है, लेकिन जैसा कि दूसरों ने कहा, var का उपयोग नहीं किया जाना चाहिए, इसलिए मुझे लगता है कि Resharper में संकेत बंद करना बिल्कुल ठीक है।


बहुत उपयोगी है जब कारखाने के तरीकों को बुलाते हैं, फिर "नया"
इयान रिंगरोज

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

24

'var' स्पष्ट होने के बारे में है

varकीवर्ड का उपयोग करने या न करने के बारे में मुख्य बहस यह है कि आपके और अन्य डेवलपर्स के लिए कोड कितना पठनीय है।

जैसे कि आप एक कहानी लिख रहे थे, निश्चित सही उत्तर नहीं है। लेकिन आइए सादे अंग्रेजी में इसके कुछ उदाहरण देखें।

जेक ने बिल को नमस्ते कहा। वह उसे पसंद नहीं करता था इसलिए वह मुड़ गया और दूसरे रास्ते चला गया।

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

जेक ने बिल को नमस्ते कहा। जेक बिल को पसंद नहीं करता था इसलिए वह मुड़ गया और दूसरे रास्ते से चला गया।

इस मामले में और अधिक विशिष्ट होने के कारण वाक्य स्पष्ट हो गया। लेकिन यह हमेशा मामला नहीं होगा। कुछ मामलों में विशिष्ट होने के कारण इसे पढ़ना कठिन हो जाता है।

बिल को किताबें पसंद हैं, इसलिए बिल लाइब्रेरी में गया और बिल ने एक किताब निकाली जो बिल को हमेशा से पसंद रही है।

इस मामले में वाक्य को पढ़ना आसान होगा यदि हमने "वह" का उपयोग किया और कुछ मामलों में अपना नाम सभी को एक साथ छोड़ दिया, जो कि varकीवर्ड का उपयोग करने के बराबर है ।

बिल को किताबें पसंद हैं, इसलिए उन्होंने लाइब्रेरी में जाकर एक किताब निकाली जो उन्हें हमेशा से पसंद रही है।

वे उदाहरण जिस्ट को कवर करते हैं, लेकिन वे पूरी कहानी नहीं बताते हैं। उन उदाहरणों में व्यक्ति को संदर्भित करने का केवल एक ही तरीका था। या तो उनके नाम का उपयोग करके या "वह" और "उसे" जैसे अधिक सामान्य शब्द का उपयोग करके।

कोड के मामले में हमारे पास 3 तरीके हैं जिनसे हम स्पष्टता जोड़ने में मदद कर सकते हैं। प्रकार, चर नाम और असाइनमेंट। उदाहरण के लिए कोड की यह लाइन लें:

Person p = GetPerson();

अब सवाल यह है कि कोड की उस पंक्ति में पर्याप्त जानकारी है जिससे आपको पता चल सके कि क्या चल रहा है?

कोड की निम्नलिखित पंक्ति के बारे में क्या? क्या आप अब भी जान पाएंगे pकि इस मामले में क्या मतलब है:

var p = GetPerson();

अभी के बारे में कैसे:

var p = Get();

या अभी:

var person = Get();

या यह एक:

var t = GetPerson();

या यह:

var u = Person.Get();

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

व्यक्तिगत रूप से मैं उस varकीवर्ड का उपयोग करना पसंद करता हूं जो मेरे लिए अधिक व्यापक है । लेकिन मैं भी अपने चर का नाम टाइप करता हूं, इसलिए मैं वास्तव में कोई जानकारी नहीं खो रहा हूं।

मैंने कहा कि कभी-कभी मैं अपवादों के संदर्भ में निर्भर करता हूं, ऐसा कुछ भी जटिल नहीं है, और यदि कुछ भी जटिल नहीं है तो सॉफ्टवेयर कुछ भी नहीं है।


1
मुझे यह उत्तर सबसे अच्छा लगता है, क्योंकि मेरे पास तब तक कुछ नहीं है varजब तक मुझे पता है कि उस एक पंक्ति को पढ़ते समय यह क्या है। अगर मुझे पता नहीं है कि एक अलग डोमेन मॉडल का उपयोग करके दूसरे समाधान से क्या विधि वापस आ रही है, तो मेरे पास उस प्रकार को स्पष्ट रूप से परिभाषित किया गया है, जिससे इसे पढ़ना बहुत आसान है। +1
पायोटर कुला

आपके सभी मामलों में जहां लौटा गया प्रकार स्पष्ट नहीं है, मैं मानता हूं कि आपको var का उपयोग नहीं करना चाहिए क्योंकि अब आप उपयोगी जानकारी को छोड़ रहे हैं।
रोल

18

मुझे यह भी नापसंद था।

मैं नहीं चाहता कि यह एक बहस में बदल जाए var, इसके उपयोग हैं लेकिन इसका उपयोग हर जगह नहीं होना चाहिए।

याद करने के लिए महत्वपूर्ण बात यह है कि आप जो भी कोडिंग मानक चाहते हैं, उसे ReSharper कॉन्फ़िगर किया गया है।

संपादित करें: ReSharper और var


13
एक साल या तो विरोध के बाद, मैं हमेशा अब var का उपयोग करता हूं।
LiamB

15

मुझे कई सही उत्तर दिखाई दे रहे हैं, लेकिन पूरा याद आ रहा है।

यह सच है कि ReSharper varडिफ़ॉल्ट रूप से अति प्रयोग करता है। मुझे लगता है कि ज्यादातर लोग इससे सहमत होंगे। जब varउपयोग किया जाता है तो पढ़ना आसान होता है और प्रकार स्पष्ट होता है जैसे कि आप किसी newकथन का उपयोग करते हैं। मैंने एक पोस्ट देखी जिसमें दिखाया गया था कि निरीक्षण गंभीरता को अपडेट करने के लिए केवल उपयोग के लिए संकेत कैसे दिखाए जाएं var

मैंने पहले अन्य पोस्ट पर टिप्पणी करने की कोशिश की थी कि इन्हें कहां जोड़ा जाए लेकिन इसके लिए प्रतिष्ठा नहीं थी। जाहिर है, मैं भी सेटिंग्स के अपने स्क्रीनशॉट पोस्ट करने के लिए प्रतिष्ठा नहीं था।

मैं समझाऊंगा कि वहां कैसे पहुंचा जाए।

दृश्य स्टूडियो में> मुख्य मेनू> पुनर्विक्रेता> विकल्प> कोड संपादन> सी #> कोड शैली> घोषणाओं में वार उपयोग

  • अंतर्निहित प्रकारों के लिए स्पष्ट प्रकार का उपयोग करें
  • सरल प्रकारों के लिए स्पष्ट होने पर 'var' का उपयोग करें
  • अन्यत्र Use'var '

यहां छवि विवरण दर्ज करें

ReSharper हेल्प डॉक्यूमेंटेशन: कोड सिंटैक्स स्टाइल: इंप्लिकेट / एक्सप्लोसिव टाइपिंग ('var' Keyword) - 'var' कीवर्ड का उपयोग करने की प्राथमिकताएँ कॉन्फ़िगर करें


इसे var डिबेट्स के बाहर सही उत्तर के रूप में चिह्नित किया जाना चाहिए, यह संतुलित दृष्टिकोण है
ब्रायन ओग्डेन

क्या आप इस बात पर एक उदाहरण दे सकते हैं कि "जहां स्पष्ट है" कैसे तय किया जाता है?
रोल


13

मेरा नियम यह है:

  • आप एक आदिम प्रकार की घोषणा कर रहे हैं (यानी byte, char, string, int[], double?, decimal, आदि)? -> प्रकार का उपयोग करें:

    string myStr = "foo";
    int[] myIntArray = [123, 456, 789];
    double? myDouble = 123.3;
  • आप जटिल प्रकार की घोषणा कर रहे हैं (यानी List<T>, Dictionary<T, T>, MyObj)? -> उपयोग करें var:

    var myList = List<string>();
    var myDictionary = Dictionary<string, string>();
    var myObjInstance = new MyObj();

मैं असहमत होना चाहूंगा, string myStr = "foo";स्पष्ट है कि यह एक स्ट्रिंग है। मैं आपके सभी उदाहरणों को var श्रेणी के उपयोग में लाऊंगा ... और घोषणाएँ जो एक प्रकार से रिटर्न हैं जो कि एक्सप्लिसिटी प्रकार का उपयोग करने के लिए हैं। लेकिन दिन के अंत में, यह वह है जो आप और आपकी टीम विशेष परियोजना के लिए बेहतर महसूस करती है।
डीन मेहान

12

मैं केवल यह बताना चाहूंगा कि C # कोडिंग कन्वेंशन में "var" के उपयोग की सिफारिश की जाती है

जब चर का प्रकार असाइनमेंट के दाईं ओर से स्पष्ट होता है, या जब सटीक प्रकार महत्वपूर्ण नहीं होता है

इसलिए शायद यही कारण है कि टिप ReSharper में डिफ़ॉल्ट रूप से है। वे कुछ मामले भी प्रदान करते हैं जहां यह उसी दस्तावेज़ में नीचे पठनीयता में सुधार नहीं करेगा।


यह बहुत अच्छा है जब आप जानते हैं कि यह प्रकार किस प्रकार से आता है System.Diagnostics.PerformanceCounter() - आप आसानी से इसके डायग्नोस्टिक्स क्लास में निर्मित परफ्यूमेंस काउंटर को बता सकते हैं। लेकिन यहाँ किस प्रकार लौटा है? var thingyMaBob = GetThatSpecialThing(18,null,(MyEnum)2)? कोई क्लॉकिंग क्लू नहीं, खासकर यदि आपके समाधान में 100 से अधिक परियोजनाएं हों।
पायोटर कुला

"अनुशंसित जब चर का प्रकार स्पष्ट है", और "वे कुछ मामले भी प्रदान करते हैं जहां यह उसी दस्तावेज़ में नीचे पठनीयता में सुधार नहीं करेगा"। ईमानदारी से, मुझे लगता है कि मैंने आपकी बात याद कर ली है। मेरा जवाब वही कहता है जो आप कहते हैं।
जोस

6

ReSharper अनुशंसा करता है varक्योंकि यह ऑब्जेक्ट निर्माण को अव्यवस्थित करने के लिए जाता है।

इन दो उदाहरणों की तुलना करें:

StringBuilder bld = new StringBuilder();

var bld = new StringBuilder();

यह सिर्फ एक आशुलिपि है जिसे पढ़ना आसान माना जाता है।

मुझे लगता है कि यह ठीक है जब आप नई वस्तुओं को स्पष्ट रूप से "नए" के साथ बनाते हैं। हालांकि आपके उदाहरण में, यह स्पष्ट नहीं हो सकता है कि कक्षाएं ठीक से नामित नहीं की गई थीं।


6

BTW, ReSharper 'आप अपने कोड के लिए इस सुझाव को लागू करना चाहते हो सकता है' और 'अपने कोड टूट गया है, मुझे इसे ठीक करना चाहते हैं?' के बीच एक अंतर आकर्षित करता है। varकीवर्ड की तरह "अगर उलट घोंसले कम करने के लिए" चीजों के साथ-साथ सुझाव श्रेणी में है; आपको इसका पालन करने की आवश्यकता नहीं है।

आप कॉन्फ़िगर कर सकते हैं कि विकल्प चेतावनी के माध्यम से या सीधे उस अलर्ट के लिए पॉपअप मेनू के माध्यम से इसके प्रत्येक अलर्ट को कितना परेशान किया जाता है। आप varसुझाव जैसी चीजों को अपग्रेड कर सकते हैं ताकि वे कम प्रमुख हों, या आप 'उपयोग विस्तार विधि' जैसी चीजों को अपग्रेड कर सकें, इसलिए यह एक वास्तविक त्रुटि के रूप में दिखाई देती है।


5

var.Net 3.0 की सुविधा केवल प्रकार का निष्कर्ष है , जो सुरक्षित है और अक्सर आपके कोड को पढ़ना आसान बनाता है। लेकिन आपके पास नहीं है, और यदि आप चाहें तो उस सिफारिश को फेरबदल में बंद कर सकते हैं।


4

वर अद्भुत है! मुझे कई ऐसे डेवलपर मिले हैं जो इस धारणा के तहत हैं कि varयह एक गतिशील प्रकार से जुड़ा हुआ है, ऐसा नहीं है। यह अभी भी सांख्यिकीय रूप से टाइप किया गया है, यह सिर्फ कंपाइलर द्वारा तय किया गया है।

यहाँ var का उपयोग करने के कुछ अद्भुत सकारात्मक हैं

उदाहरण के लिए, कम टाइपिंग संस्करण छोटा और पढ़ने में आसान है

Dictionary<int,IList<string>> postcodes = new Dictionary<int,IList<string>>()

var postcodes = new Dictionary<int,IList<string>>()\ o / \ o /

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

कम कोड बदलता है - यदि किसी कॉल विधि का रिटर्न प्रकार बदलता है। आपको केवल मेथड कॉल को बदलना होगा, न कि हर उस जगह का इस्तेमाल किया जाएगा।

अनाम प्रकार - अनाम प्रकार वास्तव में शक्तिशाली अवधारणा हैं, विशेष रूप से WebApi आंशिक संसाधनों जैसे क्षेत्रों में । संस्करण के बिना, उनका उपयोग नहीं किया जा सकता है।

हालांकि कभी-कभी यह प्रकारों को स्पष्ट रूप से घोषित करने के लिए उपयोगी होता है और मुझे यह प्राथमिकताओं या संरचनाओं में सबसे उपयोगी लगता है। उदाहरण के लिए, मुझे व्यक्तिगत रूप से यह वाक्यविन्यास बहुत उपयोगी नहीं लगता है:

for(var i = 0; i < 10; i++) 
{

}

बनाम

for(int i = 0; i < 10; i++) 
{

}

यह सभी व्यक्तिगत पसंद पर varनिर्भर करता है, लेकिन वास्तव में इसका उपयोग आपके विकास को गति देगा और गुमनाम प्रकार की अच्छाई की पूरी दुनिया को अनलॉक करेगा।


2

कोई तकनीकी अंतर नहीं है, यदि आप var का उपयोग करते हैं, तो प्रकार संकलक द्वारा निहित होता है। यदि आपके पास इस तरह का एक कोड है:

var x = 1;

x को एक इंट के रूप में निहित किया गया है और कोई अन्य मान इसे नहीं सौंपा जा सकता है।

यदि आप चर के प्रकार को बदलते हैं तो var कीवर्ड उपयोगी है; तब आपको केवल दो के बजाय एक परिवर्तन करना होगा:

var x = 1; --> var x = "hello";
int x = 1; --> string x = "hello";

1
@AlexKamburov कोड 10 लाइनें नीचे वैसे भी टूट जाएंगी, जो var से संबंधित नहीं है।
14:32 बजे user3285954

1
@ user3285954 कुछ मामलों में var समस्या को छुपा सकता है और वह तब है जब चीजें बदसूरत हो सकती हैं। समस्या लिखित कोड में नहीं है, समस्या स्थिरता में है। कुछ का तर्क है कि यह var के साथ क्लीनर है, लेकिन मैं इसे कभी-कभी obfuscation के रूप में देखता हूं। यह एक धार्मिक बहस के करीब है। brad-smith.info/blog/archives/336 मैं व्यक्तिगत रूप से केवल Linq स्टेटमेंट्स और अन्य स्थानों के लिए var का उपयोग करता हूं जहां प्रकार की घोषणा करना वास्तव में क्रिया है। मुझे लगता है कि var एक अच्छा जोड़ है और लोगों को इसे शुरू करने के कारणों पर एंडर्स हेजलबर्ग की टिप्पणियों को देखने की जरूरत है।
एलेक्स काम्ब्रोव

2

varकीवर्ड सी # 3.0 में पेश किया गया था - यह हमारे प्रकार स्पष्ट रूप से निर्दिष्ट करने के बारे में भूल करने के लिए हमें अनुमति देता है।

आप उपयोग करते हैं या नहीं इसका कोई वास्तविक अंतर नहीं है

MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);

या

var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);

शुद्ध पठनीयता को छोड़कर और त्रुटि के लिए कम मौका।

यह एक क्लिच उदाहरण की तरह लगता है, लेकिन कहते हैं कि निम्नलिखित आपकी समझ में मदद कर सकते हैं:

var myInt = 23;

एक intप्रकार देता है , जबकि

var myInt = "23";

एक stringप्रकार देता है ।

MSDN संदर्भ


2

एक स्पष्ट वस्तु प्रकार निर्दिष्ट करना किसी तरह बेमानी है। यहां तक ​​कि अंग्रेजी में अनुवाद किया गया है, यह बेमानी लगता है: "टाइप X के एक चर में टाइप X का ऑब्जेक्ट डालें" बनाम "एक वेरिएबल में टाइप X का ऑब्जेक्ट डालें"।

हालाँकि, 'var' के उपयोग की अपनी सीमाएँ हैं । यह बहुरूपता के निम्न उपयोग को रोकता है जो शुद्ध सौंदर्य है :

मान लें कि एक कुत्ता पशु का विस्तार करता है; बिल्ली पशु वर्ग पदानुक्रम का विस्तार करती है:

Animal x = new Dog();
DoStuffWithDog(x as Dog);

x = new Cat();
DoStuffWithCat(x as Cat);

void DoStuffWithDog(Dog d){}
void DoStuffWithCat(Cat c){}

समान कोड, 'var' के साथ x घोषित नहीं होगा

var x = new Dog(); // from this point, x is a Dog
DoStuffWithDog(x as Dog);

x = new Cat(); // cannot assign a Cat instance to a Dog
DoStuffWithCat(x as Cat);

void DoStuffWithDog(Dog d){}
void DoStuffWithCat(Cat c){}

वैसे भी, मूल प्रश्न पर वापस, मैं Resharper का उपयोग नहीं करता, लेकिन मुझे लगता है कि यह पता लगाने के लिए पर्याप्त स्मार्ट है कि 'संस्करण' का उपयोग न करें। :-)


4
अनावश्यक कास्टिंग (के साथ as) शुद्ध भयानक है। आप रनटाइम त्रुटियों में संकलित त्रुटियों को संकलित करते हैं यदि आपके पास कुछ ऐसा Animal x = new Cat(); DoStuffWithDog(x as Dog); क्यों है जिसका पुनः उपयोग x है? डॉग x = नया डॉग (), कैट वाई = नई कैट (), बूम नो मोर संभव अस्पष्टता।
मार्क सोउल

कास्टिंग ('के रूप में' या नहीं) एक रन समय त्रुटि में परिणाम कर सकता है। जब आप जानते हैं कि आप क्या कर रहे हैं, तो कास्टिंग के बारे में इतना 'भयानक' क्या है? एक्स का पुन: उपयोग क्यों? यहाँ उदाहरण उदाहरण है। उदाहरण का लक्ष्य यह दिखाना है कि 'var' का उपयोग करने पर सीमाएं हो सकती हैं जब एक संदर्भ बहुरूपी होता है।
xtrem

5
नहीं, यह नहीं हो सकता: बहुरूपता यहाँ क्या चल रहा है, इसके विपरीत है। यह उन Animalविधियों में टाइप की वस्तुओं को पास करने की कोशिश कर रहा है जो लेती हैं Dogऔर Cat। बहुरूपता विपरीत है: तो तुम प्रकार के ऑब्जेक्ट पारित कर सकते हैं Dogऔर Catमें एक विधि है कि लेता है Animalउदाहरण के लिए, void Walk(Animal a): Walk(new Cat()),Walk(new Dog())
मार्क Sowul

आपको इस तरह से चर का पुन: उपयोग नहीं करना चाहिए, बहुत बुरा कीड़े की ओर जाता है। छोटे तरीकों में इतना स्पष्ट नहीं है, लेकिन जब आपके पास कोड की 15-20 लाइनें होंगी तो आप भूल जाएंगे कि x क्या है। आलसी मत बनो: var dog = new dog (); DoStuff (कुत्ता); var cat = new cat (); DoStuff (बिल्ली);
1532 बजे user3285954

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

2

मेरे विचार में, varकेवल तब उपयोग किया जाना चाहिए जब यह तुरंत स्पष्ट हो कि चर का मान निर्धारित करते समय प्रकार क्या है।

उदाहरण:

var s = "string value";

यह स्पष्ट है कि sstring

मेरा मानना ​​है कि यह भी उचित है जब चर प्रकार नाम बहुत जटिल है।

उदाहरण:

Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>> dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();

// This is a little easier to read than the above statement
var dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();

इन परिदृश्यों के अलावा, मैं किसी भी GAIN का उपयोग करके नहीं बनाया जा सकता है var, लेकिन मैं कुछ परिदृश्यों के बारे में सोच सकता हूं जिनमें यह हानिकारक हो सकता है:

उदाहरण के लिए, एक डिस्पोजेबल प्रकार जिसका राइट-हैंड-साइड चर मान स्पष्ट रूप से प्रकार नहीं दिखाता है। आईडीआईसपोजेबल के निपटान के बारे में आसानी से भुलाया जा सकता है

उदाहरण:

// returns some file writer
var wr = GetWriter();

wr.add("stuff");
wr.add("more stuff");

//...
//...

// Now `wr` needs to be disposed, 
// but there is no clear indication of the type of `wr`,
// so it will be easily overlooked by code writer and code reviewer.

1

'var' आपके कोड में "डायनामिक" तत्व का एक प्रकार जोड़ता है (हालांकि कोड निश्चित रूप से कड़ाई से टाइप किया जाता है)। मैं उन मामलों में इसका उपयोग करने के खिलाफ सलाह देता हूं जहां प्रकार स्पष्ट नहीं है। इस उदाहरण पर विचार करें:

var bar = GetTheObjectFromDatabase();
bar.DoSomething();

ClassA {
  void DoSomething() {
  //does something
  }
}

ClassB {
  void DoSomething() {
  //does something entirely different
  }
}

दोनों प्रकार के DoSomething () को लागू करने के बाद, गेट AOjectFromDatabase के रिटर्न प्रकार को A से B में बदला जाना चाहिए। हालाँकि, कोड अब वास्तव में पूरी तरह से कुछ अलग कर सकता है।

यह एक लॉग में अलग-अलग सामान लिखने के रूप में दोनों के रूप में सूक्ष्म हो सकता है, इसलिए आपको यूनिटल नोटिस नहीं हो सकता है बहुत देर हो चुकी है।

Var का निम्न उपयोग हमेशा ठीक होना चाहिए:

var abc = new Something();

1

उन लोगों के लिए जो "var" के निरंतर उपयोग को नापसंद करते हैं, आप "परिचय चर" करते समय ReSharper को डिफ़ॉल्ट से var तक रोक सकते हैं। यह कुछ ऐसा था जिसने मुझे लंबे समय तक निराश किया, यह हमेशा var के लिए डिफ़ॉल्ट था, और मैं इसे हर बार बदल रहा था।

ये सेटिंग कोड संपादन> C #> कोड शैली के अंतर्गत हैं

यहां छवि विवरण दर्ज करें


0

कोई तकनीकी अंतर नहीं है (जैसा कि eWolf ने बताया है)। आप एक या दूसरे का उपयोग कर सकते हैं, उत्पन्न सीएलआर कोड समान दिखाई देगा।

मेरी राय में मुख्य लाभ यह है कि यह आपको बेहतर चर नामकरण का उपयोग करने के लिए मजबूर करता है। आपके उदाहरण में 'फू' एक चर नाम के लिए एक बहुत ही खराब विकल्प है।


0

JetBrains (ReSharper के लेखक) के अनुसार, वे डिफ़ॉल्ट रूप से var के उपयोग को प्रोत्साहित करते हैं।

से अपनी वेबसाइट :

varC # 3.0 में प्रस्तुत अनुमानित रूप से टाइप किए गए स्थानीय चर (जिसे कीवर्ड के रूप में भी जाना जाता है ) का उपयोग करना काफी लोकप्रिय हो गया है क्योंकि यह कई परिदृश्यों में पठनीयता में सुधार करता है। डिफ़ॉल्ट रूप से, ReSharper भी varकीवर्ड का उपयोग करने के लिए प्रोत्साहित करता है, लेकिन इसके उपयोग की प्राथमिकताएं लचीले रूप से कॉन्फ़िगर करने योग्य हैं - उदाहरण के लिए, आप विशिष्ट मामलों में या हर जगह स्पष्ट प्रकारों का उपयोग करने का विकल्प चुन सकते हैं और ReSharper आपको अपनी वरीयताओं को लागू करने में मदद करेगा।


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