2009-08-01 20 views
11

में कोशिश-गलती उत्पन्न करता है एक इटरेटर ब्लॉक के प्रयोग के बाद मैंने देखा कि उत्पन्न आईएल कोड वह नहीं है जो मैं उम्मीद करता हूं। कोशिश करने के बजाय अंततः एक कोशिश-गलती ब्लॉक उत्पन्न होता है, जिसे मैंने कभी नहीं देखा है। मैंने देखा कि संकलक मुझे 'हस्तलिखित' सी # में गलती कीवर्ड का उपयोग करने की अनुमति नहीं देता है।इटरेटर ब्लॉक आईएल

क्या 2 के बीच कोई अंतर है?

सी # कोड:

static IEnumerable<string> ReadAllLines(string fileName) 
{ 
    using (var file = System.IO.File.OpenText(fileName)) 
    { 
     string s; 
     while ((s = file.ReadLine()) != null) 
     { 
      yield return s; 
     } 
    } 
} 

MSIL कोड:

.method private hidebysig newslot virtual final instance bool MoveNext() cil managed 
{ 
    .override [mscorlib]System.Collections.IEnumerator::MoveNext 
    .maxstack 3 
    .locals init (
     [0] bool CS$1$0000, 
     [1] int32 CS$4$0001, 
     [2] string CS$0$0002, 
     [3] bool CS$4$0003) 
    L_0000: ldarg.0 

    // try body 

    L_008d: leave.s L_0097 
    L_008f: ldarg.0 
    L_0090: call instance void ConsoleApplication2.Program/<ReadAllLines>d__0::System.IDisposable.Dispose() 
    L_0095: nop 
    L_0096: endfinally 
    L_0097: nop 
    L_0098: ldloc.0 
    L_0099: ret 
    .try L_0000 to L_008f fault handler L_008f to L_0097 
} 

जहां एक सामान्य में कोशिश अंत में एक ब्लॉक दिलचस्प लाइन है, जहां एक गलती हैंडलर निर्दिष्ट किया जाता है आईएल की अंतिम पंक्ति है अंत में हैंडलर निर्दिष्ट है।

+1

यह विशेष रूप से .net-4.0 के साथ क्यों टैग किया गया है? क्या संस्करणों के बीच यह परिवर्तन हुआ? –

उत्तर

8

हां, अंत में ब्लॉक हमेशा फ्रेम निकास पर निष्पादित होता है। एक गलती ब्लॉक तभी निष्पादित होता है जब फ्रेम के पीछे एक अपवाद अवांछित हो। MoveNext में गलती ब्लॉक ReadAllLines iterator के प्रयास ब्लॉक से निकाले गए अपवाद के मामले में उपयोग करने वाले अर्थशास्त्र को संरक्षित करता है। इटरेटर से सामान्य निकास पर उपयोग करने वाले अर्थशास्त्र को संरक्षित करने के लिए कुछ अन्य तंत्र का उपयोग किया जाना चाहिए।

+0

तो गलती में निपटान केवल तभी भाग लिया जाता है जब कोशिश भाग में अपवाद को संभाला जाता है। और नियमित निपटान जेनरेट किए गए IENumerator की निपटान विधि द्वारा संभाला जाता है। –

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