C 之匿名型別與隱式區域性變數

2022-03-22 07:42:14 字數 1377 閱讀 8857

一、匿名型別 

下面一段**展示了如何定義並且使用匿名型別:

static void main(string args)

;var patent2 = new

;var patent3 = new

;console.writeline(",", patent1.title, patent1.yearofpublication);

console.writeline(",", patent2.title, patent2.yearofpublication);

console.writeline("............................");

// 顯然編譯器生成匿名型別時,重寫了tostring

console.writeline(patent1);

console.writeline(patent2);

console.writeline("............................");

console.writeline(patent3);

}

console.writeline(patent1); 這一句輸出的是 屬性名-值。

writeline執行的時候,會隱式呼叫tostring方法。而本例輸出的是有規則的鍵值對,所以表明編譯器生成匿名型別時重寫了tostring型別的方法,所以writeline才會輸出鍵值對。

二、匿名型別的型別。

1、唯讀的屬性

繼續上面的**,當我寫入

1 patent1.title = "

aaa"; 匿名型別的屬性一旦例項化,便無法更改。

時,報錯,title屬性是唯讀的。即匿名型別一旦例項化則其屬性無法更改。這樣防止編譯器做型別推斷時出錯。

2、強型別。

匿名型別仍然是有型別的,不表示說像c++ 中 void*一樣指向任何型別。當編譯器編譯的時候,會根據匿名型別右側推斷出變數的型別。

例如

string text = "

this is a string type

";

var text = "

this is a string type

";

生成了cil(公共中間語言)是一致的。

3、匿名型別宣告時,屬性名稱 型別 順序完全一樣才屬於同一種型別,可以互相引用。

之所以要求順序是基於以下考慮:

前文提到,tostring針對定義的匿名型別重寫了,如果屬性順序不同使用同乙個tostring,則會出現不同的輸出結果。另外,在動態程式設計中,會反射或者動態呼叫乙個屬性,如果屬性順序不同的兩個匿名型別當作同乙個型別,則呼叫屬性的時候會出現比較大的問題。

C 宣告隱式型別的區域性變數

在c 中賦值給變數的值必須具有和變數相同的型別。如int值賦給int變數,c 編譯器可以迅速判斷變數初始化表示式的型別,如果變數型別不符,就會明確告訴你。提示需要強制轉換 例如在char中不允許使用加乙個數字 就可以通過強制型別轉換,先轉換為int型加過後轉換成char型,注意char在c 中是16...

C 中的匿名型別與隱式型別變數

在c 3.0中引入了linq,使得對集合的操縱發生了深刻的變化,這個變化的幕後英雄便是擴充套件方法和匿名型別。這裡我們談一談c 中的匿名型別與隱式型別變數。一 匿名型別 所謂匿名型別顧名思義就是沒有型別名稱的一種特殊的資料型別,這意味著我們不能顯式的引用這種型別的名稱。事實上它是由編譯器在後台宣告並...

C 3 0新特性之隱式型別區域性變數的使用

首先說明一下,此新特性的專題基於ms五月份分布的c 3.0規範,但是官方中文版還沒有出來,結合自己的實踐和理解,希望能和大家一起分享某些前沿的東東,很有可能一些地方會出錯,望拋磚。在c 3.0裡面,可以對區域性變數進行隱式型別宣告,就是在宣告時可以不指定該變數的型別,變數在初始化的時候會由編譯器從表...