在C#中,一個命名空間可以出現在另一個命名空間中,但是C#編譯器更喜歡只使用一個 單獨的命名空間,從而IL輸出只顯示了一個命名空間。IL中的.namespace指令在概念上類似於C#中的 namespace關鍵字。命名空間的觀點起源於IL而不是C#這樣的程序語言。
a.cs
namespace mukhi
{
class zzz
{
public static void Main()
{
}
}
}
namespace mukhi
{
class pqr
{
}
}
a.il
.assembly mukhi {}
.namespace mukhi
{
.class private auto ansi zzz extends [mscorlib]System.Object
{
.method public hidebysig static void vijay() il managed
{
.entrypoint
ret
}
}
.class private auto ansi pqr extends [mscorlib]System.Object
{
}
}
在C#文件中,我們可能有2個名為mukhi的命名空間,但是它們會變成IL文件中的一個大 的命名空間,而它們的內容會被合並。合並命名空間的工具是由C#編譯器提供的。
設計者認為這 麼處理是恰當的——他們本可以將上面的程序替代地標記為一個錯誤。
a.cs
class zzz
{
public static void Main()
{
int i = 6;
zzz a = new zzz();
a.abc(ref i);
System.Console.WriteLine(i);
}
public void abc(ref int i)
{
i = 10;
}
}
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 zzz V_1)
ldc.i4.6
stloc.0
newobj instance void zzz::.ctor()
stloc.1
ldloc.1
ldloca.s V_0
call instance void zzz::abc(int32&)
ldloc.0
call void [mscorlib]System.Console::WriteLine(int32)
ret
}
.method public hidebysig instance void abc(int32& i) il managed
{
ldarg.1
ldc.i4.s 10
stind.i4
ret
}
}
Output
10