سؤال

وبعد تجريب كتلة مكرر لاحظت رمز IL المتولدة ليس ما أتوقع لها أن تكون. بدلا من محاولة-أخيرا منع يتم إنشاء كتلة المحاولة، خطأ، وأنا لم أر أبدا. لقد لاحظت أن المترجم لا يسمح لي استخدام الكلمة خطأ في "بخط اليد" C #.

هل هناك فرق بين 2؟

وC # رمز:

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
}

وخط للاهتمام هو السطر الأخير من IL حيث يتم تحديد معالج خطأ، حيث في محاولة العادية، أخيرا عرقلة أخيرا يتم تحديد المعالج.

هل كانت مفيدة؟

المحلول

نعم، منع وأخيرا ينفذ دائما على إطار الخروج. كتلة خطأ ينفذ إلا إذا تم المساس بها استثناء الماضي الإطار. كتلة خطأ في MOVENEXT يحافظ على استخدام دلالات لحالة استثناء القيت من كتلة المحاولة للمكرر ReadAllLines. يجب أن يكون بعض آلية أخرى في الاستخدام للحفاظ على استخدام دلالات على الخروج العادي من مكرر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top