c# Var कीवर्ड का बिंदु क्या है?




variables boo (7)

मेरा मानना ​​है कि var (और कई अन्य नए कीवर्ड) विशेष रूप से लिंक का समर्थन करने के लिए जोड़े गए थे।

var एक अज्ञात प्रकार बनाने के लिए उपयोग किया जाने वाला कीवर्ड है - http://msdn.microsoft.com/en-us/library/bb397696.aspx देखें

लिनक की तुलना में अन्य स्थानों में बेनामी प्रकारों का उपयोग किया जा सकता है।

var लिंक के लिए var उपयोगी है। वास्तव में, एक विशेषज्ञ लेखक, " बिना 'var' के अनुसार, LINQ उपयोग करने के लिए बहुत दर्दनाक हो जाता है। "

var कीवर्ड एक स्पष्ट प्रकार की घोषणा की आवश्यकता को दूर करता है और मैंने उचित होने पर एसओ चर्चा के बारे में रुचि के साथ पढ़ा है।

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

जो मुझे आश्चर्यचकित करता है, सी # भाषा डिजाइनरों ने एक अलग कीवर्ड को शामिल करने के लिए परेशान क्यों किया?

अद्यतन : हां, var बेनामी प्रकारों का समर्थन करता है, लेकिन अज्ञात प्रकार स्वयं को विभिन्न कीवर्ड की आवश्यकता नहीं है ...

var anon = new { Name = "Terry", Age = 34 };

बनाम

anon = new { Name = "Terry", Age = 34 };

अस्वीकरण: मेरे उदाहरण जावा हैं क्योंकि मुझे यही पता है, लेकिन अवधारणाएं समान होनी चाहिए।

मैंने जवाब दिया कि मुझे लगता है कि महत्वपूर्ण है (गलती से एक नया चर बनाने के लिए बहुत आसान है)।

bill=5;
bi11=bill+5

बिल का मूल्य क्या है?

उस ने कहा, मुझे इसे लिखने के लिए कुछ हद तक परेशान लगता है:

DataOutputStream ds=new DataOutputStream();

अनावश्यक लगता है, लेकिन ईमानदारी से इसके साथ वास्तव में कुछ भी गलत नहीं है। यह आपको दो बार टाइप करने में अधिक समय नहीं लेता है, और यह बेहद सहायक है। आपके पास प्रश्न होने पर समय लगता है - जब आप निश्चित नहीं हैं कि कुछ एपीआई का उपयोग कैसे करें। यदि यह वास्तव में उस प्रकार की घोषणा को दो बार टाइप करने के लिए परेशान करता है, तो आप अपना समय बर्बाद क्यों कर रहे हैं? चूंकि आपने इसे पढ़ना शुरू कर दिया है, तो आपने 30 या 40 घोषणाएं टाइप की होंगी, जो आपको अगले दो हफ्तों के लिए आवश्यक प्रत्येक घोषणा के लिए पर्याप्त है।

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

एक और बात, सबसे अधिक समय कोड मेरे उदाहरण की तरह नहीं होना चाहिए। आपको क्या करना चाहिए यह है:

DataOutput ds=new DataOutputStream();

यह तुरंत इस तथ्य को छुपाता है कि आप एक ठोस वर्ग का उपयोग टेम्पलेट में कर रहे हैं। वह टेम्पलेट आपकी कक्षा में आवश्यक सभी संचालन करने में सक्षम होना चाहिए। बाद में यदि आप किसी अन्य प्रकार की आउटपुट स्ट्रीम के साथ डीएस को प्रतिस्थापित करना चाहते हैं, तो बस उस सिंगल लाइन को बदलना इसे ठीक करेगा। यदि आप DataOutputStream को कास्ट करके डेटाऑटपुट पर उपलब्ध सुविधाओं का उपयोग नहीं कर रहे थे, तो संपादक आसानी से इसे समझ पाएंगे और आपको बताएंगे।


अद्यतन: यहां दो संबंधित प्रश्न हैं, वास्तव में: 1. मुझे वैरिएबल घोषित क्यों करना है? 2. एक भाषा में "var" क्या उपयोग है जो आपको चर घोषित करता है?

(1) के जवाब असंख्य हैं, और इस प्रश्न के लिए कहीं और पाए जा सकते हैं। मेरा जवाब (2) नीचे है:

जैसा कि अन्य टिप्पणीकारों ने कहा है, LINQ इसका अनाम प्रकारों के लिए इसका उपयोग करता है। हालांकि, LINQ वास्तव में एक और सामान्य समस्या का एक उदाहरण है जहां अभिव्यक्ति के दाएं हाथ के प्रकार प्रोग्रामर के लिए अज्ञात है, या अत्यंत verbose है। विचार करें:

SomeGeneric<VeryLongTypename<NestedTypename>> thing = new   
SomeGeneric<VeryLongTypename<NestedTypename>>();

Verbose और त्रुटि प्रवण, सही? तो अब वे आपको ऐसा करने देते हैं:

var thing = new SomeGeneric<VeryLongTypename<NestedTypename>>();

जानकारी के डुप्लिकेशंस को कम करके, त्रुटियां समाप्त हो जाती हैं। ध्यान दें कि केवल टाइपिंग त्रुटियां नहीं हैं, यहां: बाएं हाथ की अभिव्यक्ति के प्रकार के लिए इस तरह से गलत तरीके से टाइप किया जा सकता है कि संकलक चुपचाप बाएं से दाएं ओर डाला जा सकता है, लेकिन कलाकार वास्तव में कुछ संपत्ति खो देता है rvalue। यह और भी महत्वपूर्ण है जब रावल द्वारा लौटाए गए प्रकार अज्ञात या अज्ञात हो सकते हैं।


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

लगभग हर .NET 3.5 उदाहरण मैं हाल ही में देख रहा हूँ var var के साथ परिभाषित सभी चर है।

बहस मैं करता हूं कि यह वास्तव में उपयोग किए जाने पर कीस्ट्रोक को बचाने के लिए पठनीयता को त्याग देता है। उदाहरण के लिए:

// What myVar is, is obvious
SomeObject myVar = new SomeObject();

// What myVar is, is obvious here as well
var myVar = new SomeObject();

समस्या यह है कि लोग इसे हर जगह उपयोग कर रहे हैं ... उदाहरण के लिए:

// WTF is var without really knowing what GetData() returns?
// Now the var shortcut is making me look somewhere else when this should
// just be readable!
var myVar = GetData();

// If the developer would have just done it explicitly it would actually
// be easily readable.
SomeObject myVar = GetData();

तो अगली बहस होगी, बस समारोह को बेहतर नाम दें ...

var weight = GetExactWeightOfTheBrownYakInKilograms();

अभी भी नहीं पता कि क्या आ रहा है। क्या यह एक int, दशमलव, फ्लोट, वजन वस्तु है, क्या? मुझे अभी भी इसे देखने में समय बर्बाद करना है ... मेरे आलसी प्रोग्रामिंग से दिन को बचाने के लिए इंटेलिजेंस क्रैच की आवश्यकता है। शायद फ़ंक्शन नाम में रिटर्न प्रकार शामिल करें। अच्छा विचार, अब var का उपयोग करके हमें कुछ भी बचा नहीं है, मेरे सभी कार्यों को वास्तविक लंबे नाम बनाने के अलावा।

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


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

स्पष्ट जहां परिवर्तनीय घोषित किया गया है:

var myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

स्पष्ट नहीं है कि चर घोषित किया गया है:

myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

ये अधिक सरल उदाहरण हैं। मुझे लगता है कि आप देख सकते हैं कि यह कहां जाता है। जटिल परिस्थितियों में यह उस जगह को खोजने में सक्षम होना अच्छा हो सकता है जहां एक चर वास्तव में परिभाषित किया गया है।


विभिन्न कीवर्ड के बिना जब आप वास्तव में पहले से मौजूद चर का उपयोग करना चाहते थे तो गलती से एक नया चर बनाना संभव हो जाता है। जैसे

name = "fred";
   ...
Name = "barney"; // whoops! we meant to reuse name





boo