[C#]強型別

iteye_1315發表於2004-12-31
首先宣告,這篇文章僅僅是個人的學習體會,並不是標準資料。如果有什麼謬誤,歡迎高手指出。

object o1 = new object();
string s1 = o1.ToString(); // s1 will be "System.Object"

object o2 = "hello";
string s2 = o2.ToString();// s2will be "hello"

這和C++很不相同。在C++裡面,o2.ToString()會呼叫object的ToString()方法,而不是string的ToString()方法。o2是對靜態string物件"hello"的一個引用,則o2雖然在語法上寫成了object型別,但它代表的是在記憶體裡的一個string物件。當程式試圖通過o2來呼叫ToString()方法的時候,系統首先要在記憶體裡面找到o2所代表的物件,然後在這個物件的函式表中找到合適的方法來執行。o2代表的是一個string物件,而string型別已經過載過ToString()方法,在o2所代表的string物件的函式表裡立刻就找到了ToString()方法,因此string型別的ToString()方法就被呼叫了。
這就是基於執行時的強型別。

具體到實現上的區別:
C++被編譯成彙編,呼叫是jmp [address in memory],直接跳轉。
C#被編譯成IL,呼叫是callvirt ClassName.FunctionName,需要經過Runtime的翻譯。雖然最終也是要jmp到某個地址去執行的,但是跳轉的這個地址,卻是由Runtime在執行的時候根據ClassName.FunctionName和ClassInstance address計算出來的。

相關文章