2010-06-18 12 views
21

जब मैं ऑब्जेक्ट प्रारंभकर्ता सी # में दिखाई देता था तो मैं बहुत उत्साहित था।सी # ऑब्जेक्ट प्रारंभकर्ता जटिलता। सर्वोत्तम अभ्यास

MyClass a = new MyClass(); 
a.Field1 = Value1; 
a.Field2 = Value2; 

कम लिखा जा सकता है:

MyClass a = new MyClass { Field1 = Value1, Field2 = Value2 } 

ऑब्जेक्ट प्रारंभकर्ता कोड और अधिक स्पष्ट है, लेकिन जब गुण दर्जन के लिए आते हैं नंबर और यह मुश्किल है नल मूल्यों के साथ काम सौदों में से कुछ डिबग करने के लिए जहां "नल संदर्भ त्रुटि "है। स्टूडियो पूरे ऑब्जेक्ट प्रारंभकर्ता को त्रुटि बिंदु के रूप में दिखाता है।

आजकल मैं केवल त्रुटि मुक्त गुणों के लिए सीधे असाइनमेंट के लिए ऑब्जेक्ट प्रारंभकर्ता का उपयोग करता हूं।

आप जटिल असाइनमेंट के लिए ऑब्जेक्ट प्रारंभकर्ता का उपयोग कैसे करते हैं या दर्जनों आकलनों का उपयोग करने के लिए यह एक बुरा अभ्यास है?

अग्रिम धन्यवाद!

उत्तर

17

ठीक है, ऑब्जेक्ट प्रारंभकर्ताओं के साथ मेरा मुख्य गोमांस यह है कि उन्हें एक उत्परिवर्तनीय प्रकार की शुरुआत करने की आवश्यकता होती है: जहां संभव हो, मैं अपरिवर्तनीय प्रकारों का उपयोग करना पसंद करता हूं। ऐसा कहने पर, जब कोई ऑब्जेक्ट प्रारंभकर्ता काम करेगा (उदा। UI नियंत्रण के लिए) मैं उनका उपयोग करता हूं।

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

मैं नहीं कह सकता मैं वस्तु initializers के साथ संपत्ति कार्य के दौरान अपवादों के साथ किसी भी समस्याओं पड़ा है - यह सिर्फ कुछ है कि मेरे लिए ऊपर आता है नहीं है। अगर ऐसा हुआ, मैं शायद एक असफल इकाई परीक्षण वैसे भी, जिस बिंदु पर कोड आमतौर पर वैसे भी डिबगर के बिना ठीक करने के लिए आसान हो जाता है लिखने की कोशिश होगी।

स्पष्ट रूप से संयम हमेशा एक अच्छी बात है - मैं इसे चरम पर ले जाने का सुझाव नहीं दे रहा हूं ... लेकिन यदि आप एक दर्जन गुण स्थापित कर रहे हैं, तो ऑब्जेक्ट प्रारंभकर्ता का उपयोग करके मुझे चिंता का विषय नहीं होगा शुरू करने के लिए सेट करने के लिए एक दर्जन गुण हैं। इन दर्जन संबंधित गुणों के किसी भी कर रहे हैं? उन एक साथ किसी भी तरह समझाया जाना चाहिए? (कुछ मामलों में ठीक है, विशेष रूप से यूआई नियंत्रण के साथ - लेकिन अक्सर यह नहीं है।)

+1

आमतौर पर मेरे पास व्यावसायिक वस्तुओं से निपटने पर ऐसा कोड होता है। गुण यूआई से आते हैं या विभिन्न तालिकाओं से आते हैं। –

+0

मैं डीएओ में ऑब्जेक्ट प्रारंभकर्ताओं को नापसंद करता हूं क्योंकि आप आमतौर पर पाठक से फ़ील्ड प्राप्त कर रहे होते हैं और अक्सर ऐसा कुछ होता है जो गलत हो सकता है। आपको कोई कंपाइलर सुरक्षा नहीं मिलती है। आप वास्तव में इस मामले में यूनिट परीक्षण के साथ स्वयं को सुरक्षित नहीं कर सकते क्योंकि यह एकीकरण परीक्षण बन जाता है। डीबी के बाहर आम तौर पर उनके साथ जुड़े कुछ क्षेत्र होते हैं। हालांकि अगर असाइनमेंट तुच्छ हैं तो मैं ऑब्जेक्ट प्रारंभकर्ता का उपयोग करूंगा। – uriDium

0

मैं इसे विकास में नहीं होने वाले कोड में कभी भी उपयोग नहीं करता क्योंकि आप बताते हैं कि डीबग करना अधिक कठिन है।

कोड के लिए अच्छी तरह से परीक्षण किया गया है, यह कोड को और अधिक पठनीय बना सकता है, हालांकि यह तर्क दिया जा सकता है कि आपको पढ़ने के लिए आसान बनाने के लिए अच्छी तरह से परीक्षण और कामकाजी कोड के साथ गड़बड़ नहीं करनी चाहिए।

याद रखें, वस्तु initialisers जहां भाषा के लिए शुरू की मुख्य रूप से Linq वाक्यविन्यास कानूनी बनाने के लिए। यही कारण है कि इसका मतलब यह नहीं है कि यह अधिक व्यापक रूप से इस्तेमाल किया जाना चाहिए।

यह कहकर कि, यदि आप कई नियंत्रणों पर गुणों का एक समूह स्थापित कर रहे हैं, तो अकेले इंडेंटेशन एक त्वरित अवलोकन प्राप्त कर सकता है कि कुछ नियंत्रणों के गुण कहां सेट हो रहे हैं।

+0

"आपको इसे पढ़ने में आसान बनाने के लिए अच्छी तरह से परीक्षण और कामकाजी कोड के साथ गड़बड़ नहीं होना चाहिए" - ऑब्जेक्ट प्रारंभकर्ता का उपयोग करके सबसे सुरक्षित रिफैक्टरिंग में से एक है। क्या आप सामान्य रूप से रिफैक्टरिंग के प्रशंसक नहीं हैं? –

+0

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

+0

आप ऑब्जेक्ट प्रारंभकर्ताओं (यहां तक ​​कि अज्ञात प्रकारों के बिना LINQ का पूरी तरह से अच्छी तरह से उपयोग कर सकते हैं, क्योंकि मुझे लगता है कि यह आपका मतलब है), हालांकि इसे पढ़ने के लिए बहुत कठिन होगा। – ErikHeemskerk

3

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

हालांकि, अगर आप कई पंक्तियों भर में काम विभाजित है, मुझे लगता है कि जब एक अपवाद फेंक दिया है वी.एस. सही लाइन को इंगित करेंगे:

MyClass a = new MyClass { 
        Field1 = Value1, 
        Field2 = Value2 }; 

नोट: मैं इस अपने आप ऐसा नहीं करते हैं, तो कोमल हो मेरे (संभवतः) भयानक लाइन-ब्रेकिंग शैली के बारे में।

+1

नहीं, नहीं :) त्रुटि होने पर मेरा स्टूडियो ऑब्जेक्ट प्रारंभकर्ता की सभी पंक्तियों को हाइलाइट करता है और मुझे नहीं पता कि संपत्ति में कोई समस्या है –

+0

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

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