2014-12-19 2 views
7

शब्दकोश को कॉल करते समय आपको KeyNotFoundException कैसे प्राप्त हो सकता है?ContainsKey (स्ट्रिंग कुंजी) कैसे एक शब्दकोश <string, string> पर keyNotFoundException को फेंक सकता है?

IDictionary<string, string> RequestParams { get; } 

कॉल यह देखते हुए कि मैं बना रहा हूं:

यह देखते हुए कि मैं एक Dictionary<string, string> लौट रहा हूँ के रूप में इस

विधि मैं फोन कर रहा हूँ के हस्ताक्षर को देखते हुए:

public IDictionary<string, string> RequestParams 
    { 
     get 
     { 

      NameValueCollection nvc = HttpContext.Request.Params; 

      #region Collect the Request Params 
      Dictionary<string, string> dict = new Dictionary<string, string>(); 
      nvc.AllKeys.ForEach(s => dict[s] = nvc[s]); 
      #endregion 

      #region Collect the Route Data Present in the Url 
      RouteData.Values.ForEach(pair => 
      { 
       string param = (pair.Value ?? "").ToString(); 
       if (!String.IsNullOrEmpty(param) && Uri.AbsolutePath.Contains(param)) 
        dict[pair.Key] = param; 
      }); 
      #endregion 

      return dict; 
     } 
    } 

और मैंने वास्तव में निरीक्षण किया है cted कि यह वास्तव में एक तत्काल और आबादी Dictionary<string, string>

+1

वर्ग किस तरह के 'RequestParams' जब आप अपवाद है? साथ ही, आपको यह कहने के लिए अपना प्रश्न संपादित करना चाहिए "यह देखते हुए कि मैं एक आईडी आईडीआईआर <स्ट्रिंग, स्ट्रिंग>' – mason

+0

@ मेसन वापस कर रहा हूं, मैंने विधि कार्यान्वयन जोड़ा है। प्रबंधित कोड –

+2

'ContainsKey' अपवाद फेंक नहीं रहा है, आपकी संपत्ति गेटटर है। और यही कारण है कि आप इस तरह संपत्ति गेटर्स में आश्चर्यजनक कोड कभी नहीं डालते हैं। हर बार जब इसे बुलाया जाता है तो एक नई वस्तु का निर्माण अप्रत्याशित होता है, विशेष रूप से यदि इसे बनाना * विफल * हो सकता है - गेटर्स को अपवाद नहीं फेंकना चाहिए। –

उत्तर

7

नोटिस, Dictionary पर नहीं, लेकिन IDictionary देता है। अंतर्निहित कार्यान्वयन जो भी करना चाहता है वह कर सकता है, यहां तक ​​कि अपने कंप्यूटर को बंद कर दें।

DictionaryContainsKey का उपयोग करते समय कोई अपवाद (कुंजी शून्य अपवाद को छोड़कर) फेंक नहीं देता है।

यह संभव है कि IDictionary के विशिष्ट कार्यान्वयन आप उपयोग कर रहे है, KeyNotFoundException फेंकता है, लेकिन है कि अभी भी अजीब हो सकता है - हालांकि, मैं एक बहुत weirder चीजों को देखा है, तो परेशान न हों :-)!

संभावित कारण: - मूल पता लगाने के लिए StackTrace का उपयोग

  • आपका गेटर एक और ही टिककर खेल के माध्यम से अपवाद फेंक रहा है।
  • तुम गलत Dictionary उपयोग कर रहे हैं, सुनिश्चित करें कि आप नाम स्थान है System.Collections.Generic
  • आप पुराने कोड चल रहा हो सकता है - यह मेरे लिए हुआ है, बहुत ही दर्दनाक। यहां तक ​​कि डिबगिंग प्रतीक भी काम कर सकते हैं। बस कुछ संशोधन करें: कुछ स्पष्ट टिप्पणी करें, और देखें कि इसका कोई प्रभाव है या नहीं। यदि आप लाइन 64 पर टिप्पणी करते हैं और आपको KeyNotFoundException मिलता है, तो आप कुछ जानते हैं ... अच्छा नहीं^_^
+0

यहां तक ​​कि शून्य कुंजी व्यवहार को दस्तावेज़ीकरण के अनुसार जरूरी नहीं माना जा सकता है "कार्यान्वयन अलग-अलग हो सकता है कि वे कुंजी की अनुमति दें शून्य होने के लिए। "' –

+0

@ जेफवार्ड क्या आप 'शब्दकोश' के साथ 'IDictionary' को भ्रमित कर रहे हैं? क्रिस 'कंटेनके' – mason

+0

@ मेसन के 'डिक्शनरी' के कार्यान्वयन के बारे में बात कर रहा था: मुझे उम्मीद है कि "आह यह नवीनतम कोड नहीं था जो मैं चल रहा था" या कुछ समान - जहां तक ​​गेटर चला जाता है, वहां कुछ भी गलत नहीं है या तो वह। 'NameValueCollection' बिल्कुल' KeyNotFoundException' नहीं फेंकता है, और शब्दकोश सूचकांक अभिव्यक्ति में कभी भी उपयोग नहीं किया जाता है। शायद माध्यमिक गेटर :-)? –

1

यह अपवाद नहीं फेंक सकता है।

गेटटर के साथ फ़ाइल के उपयोग कथनों को देखें। आप देख पा रहे हैं:

using System.Collections.Generic; 

या यह है:

using MyAmazingLib.BetterThanMS.Collections; 
संबंधित मुद्दे