2013-02-20 13 views
5

वर्ग # ब्रैकेट के लिए सी # संदर्भ कहता है: स्क्वायर ब्रैकेट [] का उपयोग सरणी, सूचकांक और विशेषताओं के लिए किया जाता है। वे पॉइंटर्स के साथ भी इस्तेमाल किया जा सकता है। (यह भी कहते हैं, सरणी के लिए) यदि एक सरणी सूचकांक सीमा से बाहर है तो एक अपवाद फेंक दिया जाता है।यह निर्धारित करने के लिए कि कौन से अपवाद "x []" फेंक सकते हैं?

तो जब आप किसी सरणी के अलावा किसी अन्य चीज़ पर स्क्वायर ब्रैकेट का उपयोग कर रहे हैं, तो आप कैसे जानते हैं कि अपवादों को फेंक दिया जा सकता है?

एक शब्दकोश (उदाहरण के लिए) यदि आप एक्सेसर तरीकों ऐसे Dictionary.TryGetValue के रूप में आप आसानी से अपवाद है कि विधि फेंक कर सकते हैं देख सकते हैं का उपयोग करें, लेकिन C# reference for square brackets [] केवल यह सरणियों पर सीमा से बाहर सूचकांक के लिए एक अपवाद फेंक सकता है कहते हैं।

तो यदि आप कुछ डेटा प्रकार के लिए स्क्वायर ब्रैकेट का उपयोग करना चाहते हैं, तो आप कहां देख सकते हैं कि उस डेटा प्रकार के लिए कौन से अपवाद फेंक दिए जा सकते हैं?

मैंने एक शब्दकोश के एक गैर-सदस्यीय सदस्य तक पहुंचने का प्रयास किया, बस यह देखने के लिए कि क्या होता है, और मुझे KeyNotFoundException मिला। मुझे पता है कि आप NullReferenceException भी प्राप्त कर सकते हैं। यह दस्तावेज कहां है? और पूरी सूची क्या है?

+1

आपको एक सूची की आवश्यकता क्यों है? क्या एक सामान्य 'पकड़ (अपवाद पूर्व) काम नहीं करेगा? – DiskJunky

+1

@ डिस्कजंकी, सामान्य अपवाद को पकड़ना सबसे खराब अभ्यास है (जब आप इसे लॉग कर सकते हैं और अभी भी बाहर निकल सकते हैं तो शीर्ष स्तर को छोड़कर)। –

+0

@pst सहमत हो गया है, क्योंकि इसे ओवरलोड किया जा सकता है, आप अपने इंडेक्सिंग कार्यान्वयन को कार्यान्वित कर सकते हैं और जो कुछ भी आपको पसंद करते हैं उसे फेंक सकते हैं :) – RobJohnson

उत्तर

4

यह प्रत्येक कार्यान्वयन के साथ दस्तावेज है। ऑपरेटर को अधिभारित किया जा सकता है क्योंकि एक विस्तृत सूची नहीं है, इसलिए किसी भी अपवाद को फेंक दिया जा सकता है। ऑपरेटर को आमतौर पर Item संपत्ति के रूप में प्रलेखित किया जाता है। , आप एक विस्तृत सूची क्या पर फेंक दिया जा सकता है की जरूरत नहीं होनी चाहिए

Dictionary.Item

Array.Item

हालांकि:

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

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

, पकड़ने के लिए एक सामान्य Exception ठीक है अगर आप सिर्फ लॉग इन करें और फिर से फेंक करने के लिए नहीं है के बाद से किसी और की संभावना कुछ भी नहीं आप इसे।

+0

धन्यवाद - मैं वास्तव में यह जानना नहीं चाहता कि सबकुछ जानने के लिए * क्या * फेंक दिया जा सकता है। मैं सिर्फ यह जानना चाहता हूं कि क्या वैध है, इसलिए मैं कल्पना कर सकता हूं कि मैं इसे संभालना चाहता हूं या नहीं। मामला और बिंदु: मेरे प्रश्न में, मैंने कहा कि शब्दकोश NullReferenceException को फेंक सकता है, लेकिन जब आप आइटम गुणों के अंतर्गत देखते हैं, तो यह वास्तव में ArgumentNullException को फेंक सकता है। तो अगर मैं NullReferenceException को पकड़ने के लिए कोड लिखता हूं, तो मुझे लगता है कि मैं अपने ट्रैक को कवर कर रहा हूं, लेकिन मैं वास्तव में मूर्खतापूर्वक कचरा कोड लिख रहा हूं। –

+0

@EdwardNedHarvey - ठीक है, "कचरा" मजबूत है। यदि आप केवल 'NullReferenceException' को पकड़ते हैं और यह' ArgumentNullException' फेंकता है, तो ऐसा होगा कि अपवाद आपके कोड या फ्रेमवर्क कोड द्वारा, स्टैक को ऊपर उठाया जाएगा। –

+0

@ डी स्टेनली पॉइंट, वास्तविक अपवाद को देखे बिना, जिसे मैं फेंक दिया जा सकता है, मुझे कोड लिखने का अनुमान है, सोच रहा हूं कि मैं एक अपवाद पकड़ रहा हूं जिसे मैं पकड़ नहीं रहा हूं। फिर जब मैं इसे डिबग कर रहा हूं, तो मैं इसे "नल" अपवाद फेंक दूंगा लेकिन इसे "नल" अपवाद नहीं मिला है, लेकिन कोड तब तक "शून्य" पकड़ने के लिए कहता है जब तक कि मैं सर्कल में घूमता हूं और आखिर में पता चलता है कि वहां से अधिक है एक अलग प्रकार का "नल" अपवाद। हाँ, यह कचरा कोड होगा। कचरे से भी बदतर मुझे इस सवाल का जवाब अब खुशी हो रही है, इसलिए मैं यह गलती नहीं करूंगा, और मैं उन स्थानों की खोज कर सकता हूं जिन्हें मैंने पहले ही बनाया है। –

1

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

एरे के लिए, यह डेटारो के लिए रेंज से बाहर हो सकता है, यह स्तंभ नहीं मिला और इसी तरह।

4

के बारे में क्या कर सकते हैं [] Operator एक शब्दकोश < TKey, TValue > या सूची < टी > को लागू किया जाता है चाहता हूँ, यह आह्वान उदाहरण के indexer। एक सूचकांक पैरामीटर के साथ एक विशेष संपत्ति है और है आमतौर पर Item कहा जाता है।

  • Dictionary<TKey, TValue>.Item Property
    ArgumentNullException – कुंजीnull है।
    KeyNotFoundException – संपत्ति पुनर्प्राप्त की गई है और संग्रह में कुंजी मौजूद नहीं है।

  • List<T>.Item Property
    ArgumentOutOfRangeException – सूचकांक 0 से कम -या- सूचकांक के बराबर या गणना से अधिक है।

  • ...

1

जब एक सरणी का उपयोग करने के लिए प्रयोग किया जाता है, यह एक IndexOutOfRangeException फेंक कर सकते हैं।

जब किसी विशेषता के लिए उपयोग किया जाता है तो यह किसी भी अपवाद को फेंक नहीं सकता है, क्योंकि कोई भी त्रुटि संकलन समय पर होगी।

जब किसी सूचकांक तक पहुंचने के लिए उपयोग किया जाता है, तो यह कोई अपवाद फेंक सकता है। इंडेक्सर को किसी भी तरह से लागू किया जा सकता है, और इसे पसंद किए गए किसी भी अपवाद को फेंक दें।

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

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