[C#]強型別
首先宣告,這篇文章僅僅是個人的學習體會,並不是標準資料。如果有什麼謬誤,歡迎高手指出。
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計算出來的。
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計算出來的。
相關文章
- c#:值型別&引用型別C#型別
- 匿名型別是不是強型別?型別
- C#的型別——值型別與引用型別C#型別
- 使用 C# 9 的records作為強型別ID - 初次使用C#型別
- 【C#之值型別vs引用型別】C#型別
- c#中值型別和引用型別的區別C#型別
- C#變數型別(1):引用型別和值型別 (轉)變數型別
- C# 物件比較(值型別、引用型別)C#物件型別
- C#型別詳解C#型別
- C#指標型別C#指標型別
- C# 型別轉換C#型別
- PHP 型別轉換&&型別強制轉換PHP型別
- 強資料型別和弱資料型別資料型別
- 淺談程式語言型別的強型別,弱型別,動態型別,靜態型別型別
- TypeScript 強大的型別別名TypeScript型別
- C# 泛型 引用型別約束 值型別約束C#泛型型別
- 強制型別轉換型別
- C#集合型別大盤點C#型別
- C#中常用集合型別C#型別
- C#學習 [型別系統] 型別轉換(11)C#型別
- java型別轉換與強制型別轉換(轉)Java型別
- 強制型別轉換之(==)型別
- TypeScript 強型別 JavaScript – Rafy Web 框架選型TypeScript型別JavaScriptWeb框架
- C#學習筆記之值型別與引用型別C#筆記型別
- C#學習 [型別系統] 基本型別介紹(10)C#型別
- 使用 C# 9 的records作為強型別ID - 路由和查詢引數C#型別路由
- 強型別語言變數和資料型別的理解變數資料型別
- C# 泛型集合的自定義型別排序C#泛型型別排序
- C#學習 [型別系統] 泛型(16)C#型別泛型
- 瞭解下C# 型別轉換C#型別
- 瞭解下C# 資料型別C#資料型別
- C# 中的動態型別C#型別
- C#集合型別大揭祕C#型別
- C#語法——元組型別C#型別
- c#資料型別學習C#資料型別
- C#基礎資料型別C#資料型別
- EF:oracle的number型別對映為C#的boolean型別Oracle型別C#Boolean
- 圖解C#的值型別,引用型別,棧,堆,ref,out圖解C#型別