2010-08-27 8 views
10

जब मैं कहता हूँमुझे स्पष्ट रूप से टाइप किए गए स्थानीय चर का उपयोग क्यों करना चाहिए?

public static IMyType GetGateWayManager() 
{ 
    IUnityContainer _container = GetContainer(); 
    IMyType _gateWayManager = _container.Resolve<IMyType>(); 
    return _gateWayManager; 
} 

यह एक चेतावनी कह Use implicitly types local variable साथ आता है।

अगर मैं

public static IMyType GetGateWayManager() 
{ 
    IUnityContainer _container = GetContainer(); 
    var_gateWayManager = _container.Resolve<IMyType>(); 
    return _gateWayManager; 
} 

के लिए इसे बदल यह ठीक है।

क्या कोई मुझे बता सकता है कि वीएस संपादक सोचता है कि यहां var का उपयोग करने का सबसे अच्छा अभ्यास क्यों है?

+4

यह चेतावनी क्या दे रही है? क्या यह वीएस कंपाइलर या रीसार्पर जैसे बाहरी उपकरण है? – codeulike

+1

तथ्य यह है कि आप "हार प्रकार" कहते हैं, सुझाव देता है कि आप 'var' के लिए दस्तावेज़ पढ़ने से लाभ उठा सकते हैं। इसका मतलब 'संस्करण' नहीं है। – AakashM

+2

निश्चित रूप से रिशेर्पर चेतावनी की तरह दिखता है ... –

उत्तर

12

किस प्रकार के लिए प्रकार हैं, इस प्रकार का ऑब्जेक्ट नहीं कह सकता है?

संकलक? हाँ बिल्कुल। कंपाइलर प्रकारों का उपयोग करता है ताकि यह अधिक संभावना हो सके कि आपका प्रोग्राम रनटाइम पर सही तरीके से कार्य करेगा, जिससे मिलान सुनिश्चित हो सके, आप वास्तव में मौजूद विधियों को कॉल कर रहे हैं, और सही प्रकार के पैरामीटर पास कर रहे हैं। यहां, कंपाइलर जांच कर रहा है कि आप वास्तव में IMyType के प्रकार को वापस कर रहे हैं।

संपादक? फिर, हाँ। संपादक पृष्ठभूमि संकलन का उपयोग करता है और कोड लिखने में आपकी सहायता के लिए जानकारी टाइप करता है। जब आप ._container के बाद हिट करते हैं तो यह आपको यह बताने के लिए प्रकार की जानकारी का उपयोग करता है कि Resolve विधि है और इसमें कौन से पैरामीटर हैं।

आप? इतना नहीं। हमने पहले ही देखा है कि संकलक यह सुनिश्चित करेगा कि आप IMyType टाइप करें, तो आप इसे उस प्रकार के रूप में घोषित करने की परवाह क्यों करते हैं जब संकलक इसे काम कर सकता है और इसे आपके लिए जांच सकता है? इसी तरह, संपादक आपको कंटेनर के तरीकों के बारे में बताएगा, तो आप यह घोषणा करने की परवाह क्यों करते हैं कि यह एकता कंटेनर या किसी अन्य प्रकार का कंटेनर है, बशर्ते आप पहले से ही वैरिएबल नाम से जानते हैं कि यह किसी प्रकार का कंटेनर है और संपादक है कि इसमें Resolve विधि है।

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

public static IMyType GetGateWayManager() 
{ 
    var container = GetContainer(); 
    var gateWayManager = container.Resolve<IMyType>(); 
    return gateWayManager; 
} 
+3

निहित टाइपिंग का एक फायदा है, जो कि अगर GetContainer का रिटर्न प्रकार बदल गया (लेकिन उसी हस्ताक्षर को रखा गया) इसका नाम बदल दिया गया था, या एक समान प्रकार के साथ प्रतिस्थापित किया गया था, उपरोक्त कोड को सामना करने के लिए बदलने की आवश्यकता नहीं होगी। (हालांकि, इसे पुनर्निर्मित करना होगा) – Massif

+0

हां, अच्छे चर नाम। क्या कमाल का तरीका है। Opacity_in_names_should_be_avoided। – Allen

2

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

+0

लेकिन ' var' रनटाइम perfermance को प्रभावित करते हैं? – Itsik

+2

@ltsik - नहीं, मैन्युअल रूप से प्रकार घोषित करने के लिए यह अलग नहीं है। –

+1

@Itsik, नहीं, यह सिर्फ वाक्यविन्यास चीनी है और संकलन समय पर सही प्रकार में परिवर्तित हो जाएगा। यह एक गतिशील प्रकार नहीं है, प्रोग्रामर को सूची <शब्दकोश <स्ट्रिंग, आईनेमरेबल >> आदि लिखने से बचाने का एक तरीका –

1

यह Resharper आपको चेतावनी देता है, वीएस संपादक नहीं।

5

यह रीशेपर हो सकता है।

रीशेर्पर var का उपयोग करने की सिफारिश करता है जब कोड में चर के प्रकार को देखा जा सकता है। आपके उदाहरण में हम देख सकते हैं कि _gateWayManagerIMyType प्रकार का होगा, फिर हम परिवर्तनीय टाइपिंग के लिए var कीवर्ड का उपयोग करते हैं। _container स्पष्ट रूप से कोड में टाइप किया जाएगा क्योंकि हम GetContainer()

6

स्पष्ट प्रकार के बजाय var का उपयोग करके resharper द्वारा सुझाया गया है क्योंकि यह स्पष्ट और उपयोगी है।

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

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

उदाहरण:

int id = getId(); 
List<MyType> myList = FindById(id); 

इस स्थिति में अगर आपको GUID को आप इस "पूर्णांक" यहाँ परिवर्तन करना होगा पूर्णांक से आईडी बदल जाते हैं। यह छोटा है, लेकिन वास्तविक जीवन परियोजनाओं में आसानी से बड़ा हो सकता है। Var के साथ आप संकलक के लिए कुछ कोड exacly है और इसे हमेशा बदलने की जरूरत नहीं है।

var id = getId(); 
var myList = FindById(id); 

मैं स्पष्ट प्रकारों को पसंद करता था, लेकिन var कोशिश करने के कुछ ही घंटों बाद मैं इसे इतनी आसानी से नहीं जाने दूंगा।

याद रखें: प्रकार को सही प्रकार के लिए संकलित समय में बदल दिया गया है। यह गतिशीलता से अलग है जिसे लगभग सभी मामलों में पुन: संयोजित नहीं किया जाता है।

+0

तो FindById विधि को देखकर, अपना दूसरा उदाहरण देखें, किस प्रकार का प्रकार वापस किया जा रहा है? आप नहीं बता सकते हैं, यह अंतर्निहित प्रकार का नुकसान है। – LarryBud

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