1.前言
C# 中存在三種形式的類型聲明字段,使得字段能夠接受多種類型的數據,它們分別是 var,object 以及 dynamic。下面的內容將對這三種的差別進行講解分析。app
首先,因爲 C# 是強類型語言,因此編譯器會在編譯期間就會執行類型檢查。spa
2.var
在通常狀況下,定義特定類型時使用的是顯式類型的聲明,如:code
string str = "asdf";
以上代碼顯式地將字符串 "asdf" 聲明爲 string 類型。對象
而使用 var 進行類型聲明時,進行的是隱式類型的聲明,如:blog
var str = "asdf";
當編譯器在進行編譯時,編譯器將會爲字段 str 建立最爲適當的類型(即已肯定類型),一旦經過編譯,則 str 的類型就不能在發生改變。如如下操做將會報錯:繼承
var str = "asdf"; // str = 123;
// Error: Cannot implicitly convert type 'int' to 'string'
使用var定義變量時有如下四個特色:ci
- 必須在定義時初始化。也就是必須是 var s = 「abcd」 形式,而不能是以下形式: var s; s = 「abcd」;
- 一但初始化完成,就不能再給變量賦與初始化值類型不一樣的值。
- var 只能聲明局部變量,for 語句,foreach 語句,using 域。
- 使用 var 定義變量和 object 不一樣,它在效率上和使用強類型方式定義變量徹底同樣。
對於像 int、double、string 等簡單數據類型,咱們最好使用特定的數據類型來聲明變量,以避免讓事情變得複雜。但當建立了一個很大的類,那麼爲了方便建立對象,最好使用 var 關鍵字。還有一種約定俗成的習慣,當咱們使用 LINQ 或 Anonymous 類型時,必須使用 var 關鍵字。字符串
3.object
object 類型在 .NET Framework 中是 Object 的別名。在 C# 的統一類型系統中,全部類型(預約義類型、用戶定義類型、引用類型和值類型)都是直接或間接從 Objetc 繼承的, object 的實質是引用類型。能夠將任何類型的值賦給 object 類型的變量。將值類型的變量轉換爲對象的過程稱爲「裝箱」。將對象類型的變量轉換爲值類型的過程稱爲「拆箱」。編譯器
object 類型的簡單聲明以下:string
object a = "asdf"; a = 123;
4.dynamic
dynamic 聲明的類型編譯時不進行類型檢查,而是在運行時執行類型檢查,其聲明示例以下:
dynamic d = "asdf";
d++;
在對以上代碼進行編譯時,編譯器不會報錯,但當執行該代碼時,編譯器將會報錯"Operator '++' cannot be applied to operand of type 'string"。
dynamic 被編譯後是一個 Object 類型,編譯器編譯時不會對 dynamic 進行類型檢查。