var,object和dynamic

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

  1. 必須在定義時初始化。也就是必須是 var s = 「abcd」 形式,而不能是以下形式: var s; s = 「abcd」;
  2. 一但初始化完成,就不能再給變量賦與初始化值類型不一樣的值。
  3. var 只能聲明局部變量,for 語句,foreach 語句,using 域。
  4. 使用 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 進行類型檢查。

相關文章
相關標籤/搜索