首先聲明,這篇文章僅僅是個人的學習體會,并不是標準資料。如果有什么謬誤,歡迎高手指出。
object o1 = new object();
string s1 = o1.tostring(); // s1 will be "system.object"
object o2 = "hello";
string s2 = o2.tostring(); // s2 will 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計算出來的。



















