2009-06-21 15 views
8

मैं अपने कोड है जो एक इकाई परीक्षण परियोजना से क्रियान्वित किया जा रहा है डिबग करने के लिए कोशिश कर रहा हूँ, लेकिन जब मैं एक विधि में कदम करने की कोशिश, यह सिर्फ अगले पर सीधे गुजरता लाइन और उस विधि के अंदर ब्रेकपॉइंट हिट नहीं है। विधि एक वर्ग पर है जो एक अलग परियोजना में है, लेकिन सभी कोड डीबग मोड में बनाया गया है और मैंने बिना किसी खुशी के समाधान की सफाई और पुनर्निर्माण की कोशिश की है।डिबगिंग (सी #), जबकि iterator ब्लॉक में कदम नहीं कर सकते

हालांकि, यह केवल के बाद से मैं विधि के लिए एक iterator ब्लॉक जोड़ा हुआ है। जब मैं इसे हटा देता हूं और पुनर्निर्माण करता हूं, तो मैं ठीक से कदम उठा सकता हूं। अजीब?

मैं विजुअल स्टूडियो 2010 बीटा 1 का उपयोग कर रहा हूं, क्या यह सिर्फ एक बग हो सकता है?

+2

हमें यह "बग" रिपोर्ट अक्सर प्राप्त होती है। यहां एक छोटी पहेली है जिसे आप अब जवाब जानते हैं: http://blogs.msdn.com/ericlippert/archive/2007/09/05/psychic-debugging-part-one.aspx https: // ब्लॉग .msdn.com/ericlippert/संग्रह/2007/09/06/मानसिक-डिबगिंग-पार्ट-two.aspx –

उत्तर

12

इटरेटर ब्लॉक स्थगित निष्पादन का उपयोग करते हैं - जिसका अर्थ है: जब तक आप वास्तव में डेटा पर पुनरावृत्ति शुरू नहीं करते हैं, कुछ भी निष्पादित नहीं होता है।

तो: क्या डेटा पुनरावृत्त किया गया है? क्या मूल्यों पर लूप कुछ भी है? यदि आपको यथासंभव सत्यापन तर्क जोड़ने की आवश्यकता है, तो आपको वर्तमान में दो विधियों की आवश्यकता है:

public static IEnumerable<int> GetNumbers(int from, int to) { 
    // this validation runs ASAP (not deferred) 
    if (to < from) throw new ArgumentOutOfRangeException("to"); 
    return GetNumbersCore(from, to); 
} 
private static IEnumerable<int> GetNumbersCore(int from, int to) { 
    // this is all deferred 
    while (from <= to) { 
     yield return from++; 
    } 
} 
6

मार्क सही है। विधि निष्पादित स्थगित कर दी गई है और जब तक कि इटेटरेटर वास्तव में निष्पादित नहीं हो जाता तब तक आप विधि में कदम नहीं उठा सकते हैं।

जब मुझे यूनिट परीक्षण में एक इटरेटर ब्लॉक डीबग करने की आवश्यकता होती है तो मैं निम्न कार्य करता हूं। मान लें कि विधि GetStuff कहा जाता है।

[TestMethod] 
public void TestGetStuff() { 
    var obj = GetStuffObje(); 
    var list = obj.GetStuff().ToList(); 
} 

। टोलीस्ट() कॉल इटरेटर को पूरा करने के लिए निष्पादित करने के लिए मजबूर करेगा। मैंने फिर GetStuff विधि के अंदर ब्रेकपॉइंट सेट किया और एक डिबगिंग सत्र

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