2012-06-15 21 views
5

DebuggerHidden, सहायक तरीकों अंकन बनाने के लिए बहुत उपयोगी है यकीन है कि बिना क्रिया अपवाद एक सुविधाजनक स्थान में डिबगर रोक:डीबगर को गठबंधन कैसे करें Iterator ब्लॉक विधियों के साथ?

                  enter image description here

दुर्भाग्य से इस के साथ काम नहीं लगता है इटरेटर ब्लॉक:

          enter image description here

(यदि ऐसा हुआ, तो डीबगर दूसरे उदाहरण में वर्तमान कथन के रूप में in दिखाएगा)।

हालांकि यह स्पष्ट रूप से विजुअल स्टूडियो की एक सीमा है (जिसके लिए मेरे पास submitted a report है), क्या कोई तरीका है कि मैं शायद इस समस्या के आसपास एक इटरेटर ब्लॉक का उपयोग कर काम कर सकता हूं?

मुझे लगता है कि ऐसा होता है क्योंकि यह इटरेटर को लागू करने के लिए संकलक-उत्पन्न कोड [DebuggerHidden] के साथ चिह्नित नहीं है। शायद ऐसा करने के लिए संकलक को मनाने के लिए कुछ तरीका है?

+0

मैं वास्तव में छुपा अपवादों में से अपने डिजाइन निर्णय इस तरह से समझ में नहीं आता। मैं दो स्थितियों को देख सकता हूं जो हो सकता है: 1) आप अन्य डेवलपर्स द्वारा उपयोग की जाने वाली लाइब्रेरी लिख रहे हैं। इस मामले में, उनके पास आपके स्रोत नहीं हैं और वीएस में सबसे कम दिखाई देने वाला स्टैक स्तर थ्रोइटरेटर होगा। तो यह वही है जो आप पहली जगह चाहते थे। 2) इस कोड का उपयोग केवल आपकी परियोजना के लिए, आपकी परियोजना के लिए किया जाता है। इस मामले में, आप इस तरह एक अपवाद अपवाद पर्ची क्यों नहीं देंगे और इसे संभाल नहीं सकते? अगर इसे फेंक दिया जाता है, तब भी जब आप डिबगिंग करते हैं, तो आप वास्तव में देखना चाहते हैं कि यह थ्रोइटरेटर के अंदर है, और अधिकांश आईपी –

+0

निश्चित रूप से इससे कोई फर्क नहीं पड़ता कि मैं इस सुविधा का उपयोग क्यों कर रहा हूं। यह वहां है और मैं सिर्फ यह देखना चाहता हूं कि सभी परिस्थितियों में इसे कैसे काम किया जाए। –

+0

लेकिन यदि आप उत्सुक हैं, तो 'PerformQuery' विधि पर विचार करें, जो तर्क देता है अगर तर्कों का कोई अर्थ नहीं है। यह केवल हमारी टीम द्वारा आंतरिक रूप से उपयोग किया जाता है।अपवाद बेकार है क्योंकि यह एक डीबग बिल्ड है, जो * विशेष रूप से * आकर्षक अपवाद * * से बचाता है ताकि विजुअल स्टूडियो बिल्कुल सही जगह पर रुक जाए। अगर परियोजना सिर्फ सामान्य "एक समस्या थी" संदेश के साथ बंद हो जाती है, तो क्या यह केवल डीबगिंग को अनावश्यक रूप से कठिन नहीं करेगा? हम * जानते हैं * एक बग है, साथ ही सही लाइन पर भी रोक सकता है! –

उत्तर

0

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

एक सहायक वर्ग है जो आपके इटरेटर को अनचाहे करता है और फिर रैपर को अपने इटरेटर पर खेलने के लिए एक विस्तार विधि का उपयोग करता है। मैं अपवादों को संभालता हूं और पुनर्स्थापित करता हूं। वीएस -2010 में मुझे अजीब तरीके से ओपी के लिए व्यवहार करने के लिए डीबग विकल्प 'केवल मेरा कोड सक्षम करें' अनचेक करना पड़ा। चेक किए गए विकल्प को छोड़कर भी आपको वास्तविक पुनरावर्तक में छोड़ देता है लेकिन ik एक रेखा की तरह दिखता है।

यह इस उत्तर को साबित करने और कम करने के लिए एक प्रयोग बनाता है कि परिदृश्य के लिए बेहतर संकलक समर्थन की आवश्यकता है।

एक्सटेंशन विधि सहायक वर्ग:

public static class HiddenHelper 
{ 
    public static HiddenEnumerator<T> Hide<T>(this IEnumerable<T> enu) 
    { 
     return HiddenEnumerator<T>.Enumerable(enu); 
    } 
} 

आवरण:

public class HiddenEnumerator<T> : IEnumerable<T>, IEnumerator<T> 
    { 
     IEnumerator<T> _actual; 
     private HiddenEnumerator(IEnumerable<T> enu) 
     { 
      _actual = enu.GetEnumerator(); 
     } 

     public static HiddenEnumerator<T> Enumerable(IEnumerable<T> enu) 
     { 
      return new HiddenEnumerator<T>(enu); 
     } 

     public T Current 
     { 
      [DebuggerHidden] 
      get 
      { 
       T someThing = default(T); 
       try 
       { 
        someThing = _actual.Current; 
       } 
       catch 
       { 
        throw new Exception(); 
       } 
       return someThing; 
      } 
     } 

     public IEnumerator<T> GetEnumerator() 
     { 
      return this; 
     } 

     IEnumerator IEnumerable.GetEnumerator() 
     { 
      throw new NotImplementedException(); 
     } 

     public void Dispose() 
     { 
      _actual.Dispose(); 
     } 

     object IEnumerator.Current 
     { 
      get { return _actual.Current; } 
     } 

     [DebuggerHidden] 
     public bool MoveNext() 
     { 
       bool move = false; 
       try 
       { 
        move = _actual.MoveNext(); 
       } 
       catch 
       { 
        throw new IndexOutOfRangeException(); 
       } 
       return move; 
     } 

     public void Reset() 
     { 
      _actual.Reset(); 
     } 
    } 

उपयोग:

 public IEnumerable<int> Power(int number, int exponent) 
     { 
      int counter = 0; 
      int result = 1; 
      while (counter++ < exponent) 
      { 
       if (result>Int16.MaxValue) throw new Exception(); 
       result = result * number; 
       yield return result; 
      } 
     } 

     public void UseIt() 
     { 
      foreach(var i in Power(Int32.MaxValue-1,5).Hide()) 
      { 
       Debug.WriteLine(i); 
      } 
     } 
+0

प्रश्न में वर्णित तरीके से काम नहीं कर रहा है :(इसके अलावा, आपका "उपयोग" उदाहरण वास्तव में 'छुपाएं' के साथ या बिना, बिल्कुल भी फेंक नहीं देता है। –

+0

हाँ, यह एक स्टैकफ्रेम चुनने में सक्षम है कोड का टुकड़ा जो पहले ही निष्पादित है ... परीक्षण/त्रुटि शुरू हुई ... – rene

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