2011-04-18 6 views
17

मैं एक विधि है कि इस तरह एक IEnumerable देता है ..IENumerable <T> लौटने वाली विधि में कदम नहीं उठा सकता है?

public virtual IEnumerable<Page> ToPages(){ 
    // foreach logic 
    yield return pages; 

    // more foreach logic 
    yield return otherPages; 

    // etc 
} 

विधि काम करने के लिए ... एक तरह से लगता है। लेकिन वास्तव में क्या परेशान है कि मैं इसमें कदम नहीं उठा सकता! मैं चारों ओर डीबगर अंक डालता हूं, और डीबगर बस उनके माध्यम से गुजरता है !!!

क्या किसी को पता है कि यह क्यों हो सकता है?

+0

मैं माफी माँगता हूँ अगर यह एक Daft सवाल की तरह लगता है ... आप नहीं था ' एक व्युत्पन्न वर्ग में इसे ओवरराइड नहीं किया था? –

उत्तर

27

विधि तब तक नहीं चलती जब तक आप इसमें गणना नहीं करते।

foo.ToPages().ToList() // will enumerate and your breakpoint will be hit. 
+0

यह एक ठोस जवाब है। Inumerable <> हमेशा आलसी निष्पादन का तात्पर्य है। एक सूची बनाम एक IENumerable कहने के साथ काम करने के बीच यह मुख्य अंतर है। समय आने पर आईनेमेरेबल स्वाद केवल पुनरावृत्ति के लिए निर्देश वापस करेगा। सूची वास्तव में संग्रह चलती है और परिणाम तुरंत उत्पन्न करती है। –

+0

यह काम किया ...लेकिन यह अजीब से परे है। यह इस तरह से क्यों व्यवहार करता है? – Ciel

+1

स्टैक ओवरव्लो मुझे 9 मिनट में जाने देता है, तो मैं आपका जवाब स्वीकार करूंगा। धन्यवाद। यह वास्तव में मुझे परेशान कर रहा था। – Ciel

0

उपज पर ब्रेक डालने का प्रयास करें। इसे ठीक करना चाहिए।

+0

आपका क्या मतलब है? मैंने पूरी विधि में प्रत्येक पंक्ति पर ब्रेकपॉइंट लगाए हैं और यह अभी भी इसमें कदम नहीं उठाता है। – Ciel

+0

"उपज" वह बिंदु है जिस पर फ़ंक्शन वापस आता है, इसे उस पर तोड़ना चाहिए। –

+0

यह होना चाहिए, हां। लेकिन यह नहीं है। – Ciel

3

आपकी गणना करने योग्य विधि केवल सदस्यों को एक्सेस करने का प्रयास करने के बाद ही निष्पादित होगी।

यह "आस्थगित निष्पादन" (http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx देखें)

वास्तव में IEnumerable जो दिया जाता है, या सिर्फ फोन पहुंच बनाने का प्रयास कहा जाता है;

var p = obj.ToPages().ToList(); 
5

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

डिजाइन और इटरेटर ब्लॉक हितों के कार्यान्वयन आप, यहाँ इस विषय पर कुछ अच्छा लेख हैं:

रेमंड चेन: (बुनियादी अंक के लिए संक्षिप्त परिचय)

http://blogs.msdn.com/b/oldnewthing/archive/2008/08/12/8849519.aspx

http://blogs.msdn.com/b/oldnewthing/archive/2008/08/13/8854601.aspx

http://blogs.msdn.com/b/oldnewthing/archive/2008/08/14/8862242.aspx

जॉन स्कीट: (एल ओंग, गहराई में)

http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx

एरिक Lippert (मुझे): (उन्नत परिदृश्यों और कोने मामलों)

http://blogs.msdn.com/b/ericlippert/archive/tags/iterators/

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