2009-10-08 14 views
6

MSDN से:क्या कोई अपवाद रूपांतरण से अपवाद फेंकने का कोई बहाना है?

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

मैं किसी खास बिंदु से असहमत नहीं है, और मैं मानता हूँ कि यह सब बहुत अच्छा है, वहाँ कभी एक कारण यह है कि अपवाद फेंक नहीं अंतर्निहित रूपांतरण के बारे में हिस्सा तोड़ने वारंट के लिए पर्याप्त महान है?

विशेष मामले से पहले मुझे एक जहां है मेरे पास है:

  1. मैं एक समारोह है, जो एक कस्टम संग्रह ऑब्जेक्ट है (हम इसे FooCollection फोन करता हूँ)।
  2. यह फ़ंक्शन एक आइटम के साथ संग्रह वापस कर सकता है, और इसे स्रोत कोड से निर्धारित किया जा सकता है कि यह होगा या नहीं। (इसके द्वारा मेरा मतलब केवल फ़ंक्शन कॉल है, फ़ंक्शन स्वयं नहीं)
  3. यदि ऐसा होता है, तो 99.9% की संभावना है कि उपयोगकर्ता एक आइटम के साथ संग्रह के बजाय एक ही आइटम चाहता है।

अब, मैं ऊपर घालना कर रहा हूँ कि क्या FooCollection =>Foo से एक अंतर्निहित रूपांतरण इस छोटे से कार्यान्वयन विस्तार को छिपाने के लिए शामिल करने के लिए है, लेकिन संग्रह में एक आइटम है कि अगर यह रूपांतरण केवल काम करेंगे।

क्या इस मामले में Exception फेंकना ठीक है? या मैं इसके बजाय एक स्पष्ट कलाकार का उपयोग करना चाहिए? इस बारे में कोई अन्य विचार कि मैं इससे कैसे निपट सकता हूं (नहीं, कार्यान्वयन के विवरण के कारण मैं केवल दो कार्यों का उपयोग नहीं कर सकता)?

संपादित करें: मैं यह ध्यान देने योग्य है कि FooCollection किसी भी इंटरफेस को लागू नहीं करता है या वास्तव में Collection विस्तार के रूप में नाम, मतलब हो सकता है इसलिए LINQ आधारित जवाब बेकार हैं के योग्य लग रहा है। साथ ही, संग्रह एक संख्यात्मक सूचकांक को कार्यान्वित करता है, यह संग्रह से निपटने का सबसे सहज तरीका नहीं है क्योंकि यह ज्यादातर नामित सूचकांक पर निर्भर करता है।

उत्तर

10

मैं दिशानिर्देशों के साथ हूं: आपको कभी भी एक निहित रूपांतरण से फेंकना नहीं चाहिए।

मैं निश्चित रूप से इस मामले में एक अंतर्निहित रूपांतरण प्रदान नहीं करता। यहां तक ​​कि एक स्पष्ट कलाकार का विचार मुझे गलत लगता है: Foo x = (Foo)fooCollection बस सही नहीं लगता है।

आप कॉलिंग कोड को FooCollection से Foo पर रूपांतरण के बारे में चिंता क्यों न करें? कोड हर किसी के लिए बहुत अधिक सहज ज्ञान युक्त होगा:

Foo a = fooCollection[0]; 
Foo b = fooCollection.First(); 
Foo c = fooCollection.FirstOrDefault(); 
// etc 
+0

'Foo x = (Foo) fooCollection' या तो' दाएं 'नहीं होगा (हालांकि यह संकलित होगा)। 'Foo x = (Foo) fooCollection.x()' जिस तरह से इसका उपयोग किया जा रहा होगा। –

+0

x() एक ऐसा फ़ंक्शन है जो fooCollection से 1 आइटम का सबसेट देता है। –

+0

कृपया प्रश्न में मेरा संपादन भी देखें। –

0

कलाकार स्पष्ट होना चाहिए। FooCollection को कम से कम एक कलाकार के बिना Foo पर असाइन करने में सक्षम होने के लिए यह बहुत अजीब होगा।

कहा जा रहा है कि, आईएमएचओ कास्ट ऐसा करने का एक अच्छा तरीका नहीं है। यहां तक ​​कि यदि आप इसे नहीं कहते हैं तो भी मैं एक फ़ंक्शन का उपयोग करूंगा क्योंकि यदि आपके पास इन कक्षाओं के कार्यान्वयन पर नियंत्रण नहीं है, तो आप कम से कम Foo ToFoo(this FooCollection collection) जैसे एक्सटेंशन प्राप्त करने के तरीके को जोड़ सकते हैं।

+0

मैं वास्तव में 50% निश्चित हूं कि यह काम नहीं करेगा क्योंकि यह सी # 4.0 और गतिशील प्रकार –

+0

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

0

एक अंतर्निहित copnversion कि केवल संग्रह में सिर्फ 1 आइटम नहीं है अगर काम करता है? तो, वास्तव में, यह ज्यादातर समय काम नहीं करता है?

मैं इस रूपांतरण को कभी भी अंतर्निहित नहीं करूंगा। स्पष्ट के साथ चिपकाओ। यदि आपके फ़ंक्शन का उपयोग करने वाला प्रोग्रामर एक आइटम चाहता है, तो उसे केवल अपनी कक्षा बतानी चाहिए।

1

यह स्पष्ट रूप से ठीक नहीं है। कभी भी तर्क लागू करने के लिए अपवादों का उपयोग करें!

आप लिंक-स्टेटमेंट FooCollection.FirstOrDefault() का उपयोग कर सकते हैं, जो शून्य या पहला आइटम देगा।

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