2009-06-23 16 views
7

नहीं मारा है मुझे कुछ अजीब लगता है (मुझे लगता है!)। यदि मैं हाँ() विधि में ब्रेकपॉइंट डालने का प्रयास करता हूं, तो यह फ़ंक्शन निष्पादित होने पर प्रोग्राम को कभी भी रोक नहीं देगा। अगर मैं कोड की किसी भी अन्य पंक्ति में ऐसा करने की कोशिश करता हूं, तो यह अपेक्षा के अनुसार काम करेगा। क्या यह एक बग है, या ऐसा कुछ है जो मुझसे बच रहा है?डीबगर ब्रेकपॉइंट

फ़िल्टर 2 ऑब्जेक्ट्स लौटाएगा, सब कुछ डीबगर को छोड़कर अपेक्षित काम करता प्रतीत होता है।

private void Form1_Load(object sender, EventArgs e) { 
    List<LOL> list = new List<LOL>(); 
    list.Add(new LOL()); 
    list.Add(new LOL()); 

    IEnumerable<LOL> filter = list.Where(
     delegate(LOL lol) { 
      return lol.yes(); 
     } 
    ); 

    string l = ""; <------this is hit by the debugger 
} 

class LOL { 
    public bool yes() { 
     bool ret = true; <---------this is NOT hit by the debugger 
     return ret; 
    } 
} 
+3

याद रखें, एक क्वेरी विधि का परिणाम जैसे _an ऑब्जेक्ट कहां है query_ का प्रतिनिधित्व करता है। यह क्वेरी का _results_ नहीं है। यह सवाल _itself_ है। यह तब तक नहीं है जब तक आप "हे प्रश्न पूछें, आपके नतीजे क्या हैं?" कि क्वेरी वास्तव में निष्पादित करता है। –

+1

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

उत्तर

16

Enumerable.Where एक आलसी ऑपरेटर है - जब तक आप कुछ चला जाता है कि के माध्यम से IEnumerable जहां (। यानी .ToList बुला() उस पर) द्वारा दिया कहते हैं, अपने कार्य बुलाया नहीं किया जाएगा।

इस के लिए अपने कोड बदलने का प्रयास करें और देखें कि क्या यह कहा जाता हो जाता है:

.... 
IEnumerable<LOL> filter = list.Where(
    delegate(LOL lol) { 
     return lol.yes(); 
    } 
).ToList(); 

string l = ""; 
2

आप सूची अमल में लाना करने के लिए है। एक जोड़ें ...

filter.ToList(); 

... घोषणा के बाद और आप अपना ब्रेकपॉइंट मारा जाएगा। मैंने देखा है कि सबसे अच्छी चर्चा के बारे में here है। यह आलसी मूल्यांकन करता है जितना मैं कर सकता था उससे बेहतर न्याय।

2

जैसा कि अन्य ने कहा है, आपने अभी अपने मानदंडों को परिभाषित किया है लेकिन इसे निष्पादन के लिए नहीं पूछा है। इसे आलसी लोडिंग कहा जाता है (दोस्तों, अगर मैं गलत हूं तो मुझे सही करें)।

क्या होता है यह देखने के लिए फ़िल्टर पर फ़ोरैच लूप चलाएं।

2

जोनाथन सही है।

इस कंसोल एप्लिकेशन को चलाने का प्रयास करें और ब्रेकपॉइंट्स सेट करें जहां इसे स्पष्ट रूप से देखने के लिए संकेत दिया गया है।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<LOL> list = new List<LOL>(); 
      list.Add(new LOL()); 
      list.Add(new LOL()); 

      IEnumerable<LOL> filter = list.Where(
       delegate(LOL lol) 
       { 
        return lol.yes(); 
       } 
      ); 

      // Breakpoint #2 will not have been yet. 
      Console.Write("No Breakpoint"); // Breakpoint #1 
      // (Breakpoint #2 will now be hit.) 
      Console.Write("Breakpoint! " + filter.Count()); 
     } 

     class LOL 
     { 
      public bool yes() 
      { 
       bool ret = true; // Breakpoint #2 
       return ret; 
      } 

     } 

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