型別推理與匿名型別

2021-08-13 05:12:10 字數 1107 閱讀 4980

我們知道c#是一種強型別化的語言,這表示每個變數都有固定的型別,只能用於接受該型別的**中。

c# 3.0 引入了新關鍵字var,格式如下:

var = ;

在這行**中,變數隱式地型別化為value 的型別。注意,型別的名稱並不是var。

eg:var myvar = 5;

myvar 是int 型別的變數,而不是var 型別的變數

使用var 時,並不是宣告了乙個沒有型別的變數,也不是宣告了乙個型別可以變化的變數。否則,c#就不再是強型別化的語言了。我們只需利用編譯器確定變數的型別即可。

注意:如果編譯器不能確定用var 宣告的變數型別,**就不會編譯。因此,在用var 宣告變數時,必須同時初始化該變數,因為如果沒有初始值,編譯器就不能確定變數的型別。

二、匿名型別:

在編寫程式一段時間後,會發現我們要花很多時間為資料表示建立簡單、乏味的類,在資料庫應用程式中尤其如此。常常有一系列類只提供屬性。前面的curry 類就是乙個很好的例子:

public class curry

public string style

public int spiciness

}這個類什麼也沒做,只是儲存結構化資料。在資料庫或電子**中,可以把這個類看作表中的一行。可以儲存這個類的例項的集合類應表示表或電子**中的多個行。

這是類完全可以接受的一種用法,但編寫這些類的**比較單調,對底層資料模式的任何修改都需要新增、刪除或修改定義類的**。

匿名型別(anonymous type)是簡化這個程式設計模型的一種方式。其理念是使用c#編譯器根據要儲存的資料自動建立型別,而不是定義簡單的資料儲存型別。

curry curry = new curry

;也可以使用匿名型別,如下所示:

var curry = new

;這裡有兩個區別。第一,使用了var 關鍵字。這是因為匿名型別沒有可以使用的識別符號。

第二,在new 關鍵字的後面沒有指定型別名稱,這是編譯器確定我們要使用匿名型別的方式。

注意:匿名型別上使用equals()比較物件的狀態,如果乙個物件的每個屬性值都與另乙個物件的對應屬性值相同,結果就是true。

但使用==運算子不會得到這樣的結果。和之前講的一樣,==運算子比較物件引用。

匿名型別與匿名物件

var匿名型別 推斷型別 var可代替任何型別,編譯器會根據上下文來判斷你到底是想用什麼型別,類似 object,但是效率比object高點。我們可以賦予區域性變數推斷 型別 var而不是顯式型別。var 關鍵字指示編譯器根據初始化語句右側的表示式推斷變數的型別。推斷型別可以是內建型別 匿名型別 使...

C 匿名型別

c 3.0引入了對匿名型別的支援。它們是由編譯器動態生成的資料型別,而不是通過顯示地類定義來宣告的。下面通過乙個例子介紹匿名型別的使用 示例 將匿名型別的例項賦給隱式型別的區域性變數 執行結果 注意 除非使用lambda表示式和查詢表示式關聯來自不同型別的資料,或者對資料進行水平投射 以減少乙個特定...

2 匿名型別

先上段 vardata new console writeline username age data.username,data.age 自己原來以為匿名型別指的就是data 其實大錯特錯 這裡的匿名型別指的是 username 和 age 一般我們會先定義 string username zhu...