2009-08-01 23 views
11

Sau khi thử nghiệm với khối lặp, tôi nhận thấy mã IL được tạo không phải là thứ tôi mong đợi. Thay vì một khối try-finally, một khối try-fault được tạo ra, cái mà tôi chưa từng thấy. Tôi nhận thấy rằng trình biên dịch không cho phép tôi sử dụng từ khóa lỗi trong 'viết tay' C#.Khối Iterator tạo ra lỗi cố định trong IL

Có sự khác biệt nào giữa 2 không?

# mã

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

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

Dòng thú vị là dòng cuối cùng của IL nơi một handler lỗi được xác định, nơi mà trong một bình thường thử-cuối cùng chặn xử lý cuối cùng được chỉ định.

+1

Tại sao thẻ này được gắn thẻ cụ thể với .net-4.0? Sự thay đổi này giữa các phiên bản? –

Trả lời

8

Có, khối Cuối cùng luôn thực thi khi thoát khung. Một khối lỗi thực hiện chỉ khi một ngoại lệ được bỏ qua khung. Khối lỗi trong MoveNext duy trì ngữ nghĩa sử dụng cho trường hợp ngoại lệ được ném từ khối thử của trình đọc lặp ReadAllLines. Một số cơ chế khác phải được sử dụng để bảo toàn ngữ nghĩa sử dụng trên lối thoát bình thường từ trình lặp.

+0

Vì vậy, Vứt bỏ trong lỗi chỉ được gọi khi xử lý một ngoại lệ trong phần thử. Và việc xử lý thông thường được xử lý bằng phương pháp Vứt bỏ của IEnumerator được tạo. –

Các vấn đề liên quan