2013-04-09 58 views
11

tôi có mã này sau khi dịch ngượcBiểu tượng <> có nghĩa là gì trong MSIL?

SampleClass sampleClass; 
    SampleClass <>g__initLocal0; 
    int y; 
    sampleClass = null; 
Label_0018: 
    try 
    { 
     <>g__initLocal0 = new SampleClass(); 
     <>g__initLocal0.X = 5; 
     <>g__initLocal0.Y = 10; 
     sampleClass = <>g__initLocal0; 
     goto Label_003A; 
    } 
    catch (Exception) 
    { 
    Label_0035: 
     goto Label_003A; 
    } 
Label_003A: 
    y = sampleClass.Y; 

Tôi không biết những gì có nghĩa là nhà điều hành/biểu tượng <> trước một số hoạt động. Có ai biết không?

Trả lời

13

Đó là tên được tạo bởi trình biên dịch - các ký tự <> là hợp pháp đối với số nhận dạng trong IL, nhưng không phải trong C#. Vì vậy, trình biên dịch biết rằng nó có thể tạo ra các tên có chứa các ký tự như vậy mà không có bất kỳ cơ hội nào mà tên sẽ xung đột với tên bạn đã sử dụng trong mã của bạn.

Trong trường hợp cụ thể này, <>g__initLocal0 là một biến mới đã được giới thiệu để giữ một thể hiện mới được xây dựng của một lớp đang được khởi tạo bằng cách sử dụng initializer syntax. Mã ban đầu là:

sampleClass = new SampleClass() { X = 5, Y = 10}; 

Nó giới thiệu để tránh sampleClass được quan sát với trường hợp xây dựng một phần - sau new SampleClass() đã thực hiện nhưng trước khi công việc để XY xảy ra. I E. nếu Y = 10 ném ngoại lệ, đảm bảo rằng sampleClass vẫn là null và không phải là SampleClass mới với X được đặt thành 5 và một số giá trị không xác định cho Y.

+1

Để biết thông tin về cách chính xác các tên này được hình thành, hãy xem [câu trả lời này từ Eric Lippert] (http://stackoverflow.com/a/2509524/41071). – svick