में कोशिश-गलती उत्पन्न करता है एक इटरेटर ब्लॉक के प्रयोग के बाद मैंने देखा कि उत्पन्न आईएल कोड वह नहीं है जो मैं उम्मीद करता हूं। कोशिश करने के बजाय अंततः एक कोशिश-गलती ब्लॉक उत्पन्न होता है, जिसे मैंने कभी नहीं देखा है। मैंने देखा कि संकलक मुझे 'हस्तलिखित' सी # में गलती कीवर्ड का उपयोग करने की अनुमति नहीं देता है।इटरेटर ब्लॉक आईएल
क्या 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
}
जहां एक सामान्य में कोशिश अंत में एक ब्लॉक दिलचस्प लाइन है, जहां एक गलती हैंडलर निर्दिष्ट किया जाता है आईएल की अंतिम पंक्ति है अंत में हैंडलर निर्दिष्ट है।
यह विशेष रूप से .net-4.0 के साथ क्यों टैग किया गया है? क्या संस्करणों के बीच यह परिवर्तन हुआ? –