這裡,變量i和j沒有被初始化。因此,這些字段沒 有在類yyy的靜態函數中被初始化。在類yyy的任何代碼被調用之前,這些變量會分派到它們的默認值,它 們依賴於它們的數據類型。在這個例子中,它們是通過int和bool類的構造函數來實現的,因為這些構造 函數會首先被調用。
a.cs
class zzz
{
public static void Main()
{
int i = 10;
string j;
j = i >= 20 ? "hi" : "bye";
System.Console.WriteLine(j);
}
}
a.il
.assembly mukhi {}
.class private auto ansi zzz extends [mscorlib]System.Object
{
.method public hidebysig static void vijay() il managed
{
.entrypoint
.locals (int32 V_0,class System.String V_1)
ldc.i4.s 10
stloc.0
ldloc.0
ldc.i4.s 20
bge.s IL_000f
ldstr "bye"
br.s IL_0014
IL_000f: ldstr "hi"
IL_0014: stloc.1
ldloc.1
call void [mscorlib]System.Console::WriteLine(class System.String)
ret
}
}
Output
bye
如果把語句壓縮到單獨的一行中,那麼使用三元操作符會更加 “壯麗”。在C#中,變量i和j在轉換到IL時變成了V_0和V_1。我們首先將變量V_0初始化為10 ,隨後把條件值20放到棧上。
l 如果條件為TRUE,那麼bge.s就會執行到標號IL_0014的跳轉。
l 如果條件為FALSE,那麼程序就會進行到標號IL_000f。
然後,程序進行到WriteLine函 數,並打印出相應的文本。
從最終的IL代碼中,無法解釋原始的C#代碼是否使用一個if語句或? 操作符。C#中的大量操作符,例如三元操作符,都是從C程序語言中借用過來的。
a.cs
class zzz
{
public static void Main()
{
int i = 1, j= 2;
if ( i >= 4 & j > 1)
System.Console.WriteLine("& true");
}
}
a.il
.assembly mukhi {}
.class private auto ansi zzz extends [mscorlib]System.Object
{
.method public hidebysig static void vijay() il managed
{
.entrypoint
.locals (int32 V_0,int32 V_1)
ldc.i4.1
stloc.0
ldc.i4.2
stloc.1
ldloc.0
ldc.i4.4
clt
ldc.i4.0
ceq
ldloc.1
ldc.i4.1
cgt
and
brfalse.s IL_001c
ldstr "& true"
call void [mscorlib] System.Console::WriteLine(class System.String)
IL_001c: ret
}
}