我正在學習C#IL簡單的例子,無法理解一些東西。我有很簡單的程序:C#IL - 調用構造函數
void Main()
{
C c = new C(1);
}
class C
{
public C(){}
public C(int i){}
}
有CIL:
IL_0001: ldc.i4.1
IL_0002: newobj UserQuery+C..ctor
IL_0007: stloc.0 // c
C..ctor:
IL_0000: ldarg.0
IL_0001: call System.Object..ctor
IL_0006: nop
IL_0007: nop
IL_0008: nop
IL_0009: ret
C..ctor:
IL_0000: ldarg.0
IL_0001: call System.Object..ctor
IL_0006: nop
IL_0007: nop
IL_0008: nop
IL_0009: ret
我不明白,虛擬機將如何區分哪一個構造函數應該是調用。有兩個相同的標籤,唯一的區別似乎是在main中推入參數。調用構造函數時有更深層的東西嗎?也許編譯器提供了一些元數據來區分應該調用哪一個?
因此,讓我們假設這樣的:
void Main()
{
C c = new C(1);
}
class C
{
public C(){}
public C(int i){ i += 1;}
}
IL_0001: ldc.i4.1
IL_0002: newobj UserQuery+C..ctor
IL_0007: stloc.0 // c
C..ctor:
IL_0000: ldarg.0
IL_0001: call System.Object..ctor
IL_0006: nop
IL_0007: nop
IL_0008: nop
IL_0009: ret
C..ctor:
IL_0000: ldarg.0
IL_0001: call System.Object..ctor
IL_0006: nop
IL_0007: nop
IL_0008: ldarg.1
IL_0009: ldc.i4.1
IL_000A: add
IL_000B: starg.s 01
IL_000D: nop
IL_000E: ret
現在,如何區分調用哪一個,在標籤的水平,我們無法分辨它。
這是關於對構造函數或構造函數體的調用嗎? - 你顯示兩個構造函數體是平等的,但你只顯示對構造函數之一的調用。 – Theraot
@Theraot - 我想知道VM如何知道這個子程序調用哪一個,特別是代碼中沒有提供什麼讓我們區分。它應該是第一個C..ctor還是第二個? – Puchacz
您需要使用更好的反彙編程序。 Ildasm.exe非常清楚使用哪個構造函數。請記住,'ldarg.0'操作碼是用於隱藏* this *參數,而不是構造函數參數。 –