可能剛學.net的人在面臨選擇哪種語言的時候,經常會問的一個問題就是C#和VB.NET哪個更好?哪個速度快?
其實從本質而言,.net支援的任何程式設計語言最終都是翻譯成IL代碼,它們的啟動並執行機制都是一樣的。這樣看起來似乎.net framework上啟動並執行所有語言之間除了文法似乎就沒有什麼區別了,其實不然。其實每種語言都額外提供了自己的特性,或者有某些限制。而且不同的編譯器實現也會帶來差異。
今天在看書(Professional C# 中文版)的時候看到關於C#和VB.NET編譯器上的一個小區別:
同樣是+操作運算子,C#會翻譯成IL的add指令:
public new int Add(int val1, int val2)
{
return val1 + val2;
}
而VB.NET翻譯成add.ovf指令。
Public Shadows Function Add(ByVal val1 As Integer, ByVal val2 As Integer) As Integer
Return val1 + val2
End Function
那麼add指令和add.ovf指令的區別在什麼地方呢。我查了一下MSDN:
add.vof : Adds two unsigned integer values, performs an overflow check, and pushes the result onto the evaluation stack.
OverflowException is thrown if the result is not represented in the result type.
區別主要是後者會產生更多的機器碼來執行溢出檢查,並且如果溢出會拋出OverflowException。這樣壞處很明顯,就是執行速度變慢,但是好處也有,就是代碼比較安全:)
因此,某些代碼C#編譯器在產生IL的時候產生的指令會比較運行得比較快,而VB.NET編譯器產生的IL代碼比較安全。各有優缺點:)
其實是否進行Overflow的檢查都是可以進行配置的(上面的只是C#和VB.NET的預設設定),在Project的Properties對話方塊中設定:
或者通過編譯器的 /checked[+ | -] 選項也可以指定是否檢查數值溢出。
另外C#還可以通過checked和unchecked關鍵字來指定是否檢查數值溢出,例如
z = checked((short)(x + y));