2009-08-01 14 views
11

numaralı makalede try-fault üretir. Bir yineleyici bloğu ile deneme yaptıktan sonra, üretilen IL kodunun beklediğim gibi olmadığını fark ettim. Sonunda bir deneme bloğu yerine, hiç görmediğim bir try-fault bloğu üretilir. Derleyicinin 'el yazısı' C# 'da hata anahtar sözcüğünü kullanmama izin vermediğini fark ettim.Iterator bloğu, IL

2 arasında bir fark var mı?

C# kodu:

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 kodu:

.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 
} 

normal try-nihayet engellemek nerede ilginç çizgi, bir arıza işleyicisi belirtilen IL son çizgidir Sonucu işleyici belirtildi.

+1

Bu özellikle neden .net-4.0 ile etiketlenmiştir? Bu sürümler arasında değişti mi? –

cevap

8

Evet, son olarak her zaman çerçeve çıkışında yürütülür. Bir hata bloğu, yalnızca çerçevenin dışına bir istisna çözülürse yürütülür. MoveNext'teki hata bloğu, ReadAllLines yineleyicisinin try bloğundan atılan bir istisnanın durumu için kullanım semantiklerini korur. Yineleyiciden normal çıkışta kullanım semantiklerini korumak için başka bir mekanizma kullanılmalıdır.

+0

Bu nedenle, arızayı atın, yalnızca deneme bölümünde bir istisnayla çalışırken çağrılır. Ve düzenli atma oluşturulan IEnumerator'ın Dispose yöntemi tarafından işlenir. –