2013-05-02 16 views
7

Tôi có mã C# sau.CIL OpCode (Ldarg_0) được sử dụng mặc dù không có đối số

public void HelloWorld() 
{ 
    Add(2, 2); 
} 

public void Add(int a, int b) 
{ 
    //Do something 
} 

Nó tạo ra các CIL sau

.method public hidebysig instance void HelloWorld() cil managed 
{ 
    // Code size  11 (0xb) 
    .maxstack 8 
    IL_0000: nop 
    IL_0001: ldarg.0 
    IL_0002: ldc.i4.2 
    IL_0003: ldc.i4.2 
    IL_0004: call  instance void ConsoleApplication3.Program::Add(int32, 
                     int32) 
    IL_0009: nop 
    IL_000a: ret 
} // end of method Program::HelloWorld 

Bây giờ, những gì tôi không hiểu là dòng tại offset 0001:

ldarg.0

Tôi biết những gì Opcode là cho, nhưng tôi không thực sự hiểu tại sao nó được sử dụng trong th là phương pháp, vì không có đối số, phải không?

Có ai biết tại sao không? :)

Trả lời

19

Trong các phương pháp thể hiện có đối số ngầm định với chỉ mục 0, thể hiện cá thể mà phương thức được gọi. Nó có thể được tải trên ngăn xếp đánh giá IL sử dụng mã vạch ldarg.0.

1

Dòng tại offset 0001: Tải đối số tại chỉ mục 0 lên ngăn xếp đánh giá.

Xem thêm tại: http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldarg_0.aspx

Đối số ở chỉ số 0 là instance của class chứa các phương pháp HelloWorldAdd, như thế này (hoặc tự trong languajes khác)

IL_0001: ldarg.0 //Loads the argument at index 0 onto the evaluation stack. 

IL_0002: ldc.i4.2 //Pushes a value 2 of type int32 onto the evaluation stack. 

IL_0003: ldc.i4.2 //Pushes a value 2 of type int32 onto the evaluation stack. 

IL_0004: call instance void ConsoleApplication3.Program::Add(int32, int32) 

... dòng cuối cùng này là gọi: this.Add(2,2); trong C#.

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