下面關注的是2個字符串的連接。C#編譯器通過將它們轉換 為一個字符串來實現。這取決於編譯器優化常量的風格。存儲在局部變量中的值隨後被放置在棧上,從而 在運行期,C#編譯器會盡可能的優化代碼。
a.cs
class zzz
{
public static void Main()
{
string s = "hi" ;
string t = s + "bye";
System.Console.WriteLine(t);
}
}
a.il
.assembly mukhi {}
.class private auto ansi zzz extends [mscorlib]System.Object
{
.method public hidebysig static void vijay() il managed
{
.entrypoint
.locals (class System.String V_0,class System.String V_1)
ldstr "hi"
stloc.0
ldloc.0
ldstr "bye"
call class System.String [mscorlib]System.String::Concat(class System.String,class System.String)
stloc.1
ldloc.1
call void [mscorlib]System.Console::WriteLine(class System.String)
ret
}
}
Output
hibye
無論編譯器何時對變量進行處理,都會在編譯器間忽略它們 的值。在上面的程序中會執行以下步驟:
l 變量s和t會被相應地轉換為V_0和V_1。
l 為局 部變量V_0分配字符串"hi"。
l 隨後這個變量會被放到棧上。
l 接下來,常量 字符串"bye"會被放到棧上。
l 之後,+操作符被轉化為靜態函數Concat,它屬於 String類。
l 這個方法會連接兩個字符串並在棧上創建一個新的字符串。
l 這個合成的字 符串會被存儲在變量V_1中。
l 最後,這個合成的字符串會被打印出來。
在C#中,有兩個 PLUS(+)操作符。
l 一個處理字符串。這個操作符會被轉換為IL中String類的Concat函數。
l 另一個則處理數字。這個操作符會被轉換為IL中的add指令。