2011-09-06 11 views
10

हाल ही में मैं एक व्यक्ति को भारी चर की घोषणा के लिए (और हर घोषणाके लिए) वर और डिफ़ॉल्ट कीवर्ड का उपयोग करके कुछ इस तरह देखा :उपयोग

Employee employee = null;   //Employee is a class 
ErrorInfo errorInfo = Blank;  //ErrorInfo is struct; Blank is default value 
Double salary = 0.0; 
Boolean? isManager = null; 

या, बजाय भी उपयोग करने का:

Employee employee;     //Employee is a class 
ErrorInfo errorInfo;    //ErrorInfo is struct; Blank is default value 
Double salary; 
Boolean? isManager; 

अब के लिए घोषणा के लिए var और default का उपयोग कर प्रत्येक चर ऐसा कुछ है जिसका मैं आदी नहीं हूं।

जानना चाहते हैं:
- यदि यह एक अनुशंसित अभ्यास है?
- आपके विचार और वरीयता?

पुनश्च:
- Use of var keyword in C#, Use of "var" type in variable declaration और https://stackoverflow.com/questions/633474/c-do-you-use-var के माध्यम से चला है, तथापि, लगता है कि हालांकि संबंधित इस प्रश्न थोड़ा अलग है के रूप में यह पूरी तरह से चारों ओर घोषणा/प्रारंभ है और नहीं आसपास काम।
- मैं स्निप 2 और स्निपेट 3 के बीच का अंतर समझता हूं। हालांकि, प्रश्न स्निपेट के आसपास अधिक है 1.
- यदि आपको दृढ़ता से लगता है कि यह प्रश्न प्रोग्रामर से संबंधित है तो स्टैकएक्सचेंज स्थानांतरित करने के लिए स्वतंत्र महसूस करता है।

+1

मैं सहमत हूं कि कुछ भी आपको लगता है कि "मुझे आश्चर्य है कि errorInfo का डिफ़ॉल्ट मान क्या है" बस पठनीयता को कम करता है। विशेष रूप से यदि आपको पता लगाना है और पता लगाने के लिए स्रोत में खोदना है। –

+0

@ बेन: मैं आपकी टिप्पणी को समझ नहीं पा रहा हूं। आपको खोदने की ज़रूरत क्यों है? संदर्भ प्रकारों के लिए डिफ़ॉल्ट मान हमेशा 'शून्य' होता है। –

+0

@ Daniel हाँ, लेकिन इस उदाहरण में errorInfo एक ऐसी संरचना है जो किसी भी यादृच्छिक प्रकार के बारे में आपने कभी नहीं सुना है, पहली नज़र में हो सकता है। –

उत्तर

8

मैं "var" के बारे में कुछ भी कहने के लिए नहीं जा रहा हूँ वहाँ अतीत (में इस बारे में टिप्पणी और विचार विमर्श किया गया है पर्याप्त रूप से इतना ;-)

के संबंध में "डिफ़ॉल्ट()" मैं इस का उपयोग नहीं होता प्रारंभ करने में ज्ञात प्रकार, बल्कि केवल जेनेरिक में। वहां यह आपको डिफ़ॉल्ट प्रकार (वापसी) मान प्रदान करने की अनुमति देकर मूल्य प्रकार या संदर्भ प्रकारों को पारदर्शी रूप से संभालने में सहायता करता है या तुलना में उपयोग किया जा सकता है।

2

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

SomeType variable1; //want to store something that will be out of scope later 
using(blah) 
{ 
    //... 
    variable1=blah; 
} 
//use variable1 here 

या सौंपे जाने आवश्यक मूल्य तुरंत:

SomeType variable2 = new SomeType(); 
//use variable2 immediately 

या (मेरे लिए, अधिक बार nowdays)

var variable2 = new SomeType(); 

अशक्त/प्लेसहोल्डर मान निर्दिष्ट मुख्य रूप से व्यर्थ है ।

4

खैर, default कीवर्ड सबसे अधिक इस्तेमाल किया कीवर्ड मुझे लगता है कि नहीं है, और मेरी राय में यह अपने उद्देश्य के लिए सबसे अच्छा जेनेरिक्स के संदर्भ में है, इसलिए की तरह कार्य करता है:

public class Foo<T>{ 

    private T _instance; 
    public Foo<T>(){ 
     _instance = default(T); 
    } 
} 

आदेश एक नया डिफ़ॉल्ट प्राप्त करने के लिए टी का उदाहरण आपके पोस्ट में परिदृश्य 1 की तरह इसका उपयोग करने के लिए वास्तव में कोई कारण नहीं हैं।

var का उपयोग करना हालांकि एक अलग सवाल है, और कई इसे पठनीयता के मामले के रूप में देखते हैं। मैं var के लिए डिफ़ॉल्ट जब मैं कोड लिखने बस क्योंकि मैं इसे पढ़ने में आसान लगता है:

var me = new Person(); 

ऐसा लगता है थोड़ा पठनीयता के मामले में अनावश्यक

Person me = new Person(); 

एक और मामला मैं var की सिफारिश करने के लिए अगर कुछ है परिवर्तन।

public decimal Calculate(decimal one, decimal two){ 
    return one + two; 
} 

और कहीं और अपने कोड में: निम्नलिखित उदाहरण पर विचार

decimal d = Calculate(1M, 2M); 

आप किसी कारण से करने के लिए, कहते हैं, doubleCalculate की वापसी प्रकार आप सभी स्थानों पर जहां बदलने की जरूरत को बदलते हैं आप दृढ़ता से चर परिभाषित किया।

आप के बजाय करते हैं

var d = Calculate(1M, 2M) 

आप इस बारे में चिंता करने की जरूरत नहीं है। डबल/दशमलव उदाहरण थोड़ा सा सरल है, लेकिन कक्षाओं को पुन: सक्रिय करने और इंटरफेसिंग करने के मामले में, मुझे यह बहुत उपयोगी पाया है।

0

मैं असाइनमेंट के लिए var का उपयोग करता हूं। हालांकि मैं हमेशा वर्ग का उपयोग कर उदाहरण घोषित करता हूं। मैं आम तौर पर उन समय अप्रत्याशित NullReferenceExceptions

0

से बचने के लिए तत्काल उन्हें तुरंत चालू करता है। कोड ठीक है।

बस यह सुनिश्चित करें कि आप इस तकनीक की प्रतिलिपि बनाने के लिए प्रतिलिपि नहीं बनाते हैं जहां 0 डिफ़ॉल्ट मान या flagged गणना नहीं है।

[Flags] 
public enum MyFlags 
{ 
    Test = 1, 
    Test2 = 2 
} 

MyFlags flags = default(MyFlags); 
Console.WriteLine(flags); // oops