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

2022-08-17 02:54:14 字數 1758 閱讀 2684

在c#3.0中引入了linq,使得對集合的操縱發生了深刻的變化,這個變化的幕後英雄便是擴充套件方法和匿名型別。這裡我們談一談c#中的匿名型別與隱式型別變數。

一、匿名型別

所謂匿名型別顧名思義就是沒有型別名稱的一種特殊的資料型別,這意味著我們不能顯式的引用這種型別的名稱。事實上它是由編譯器在後台宣告並幫你生成必要的**。

**

class

program

;var t2

=new

;var t3

=new;}

}

以上我們用var 宣告了3個隱式型別的變數t1,t2,t3,並把建立(new)的3個匿名型別的例項分別賦給它們。在這裡var相當於乙個佔位符,其變數(t1,t2,t3)的具體的型別是在**編譯時確定的,也就是說由賦給它們的值的資料型別而定的。因而在最終生成的cil中t1,t2,t3是有具體的型別的,也就是強型別的

在上例中,我們可以看到t3中使用了t1的屬性index,這說明匿名型別的屬性是完全可以訪問的。它們使用了相同的屬性名稱,屬性的資料型別也相同,並且屬性的的順序也是一致的,因而它們具有相同的型別,否則就不是相容的型別了。

如以下均不是相同的型別了,其中t4與t5的屬性不同,t4與t6的屬性順序不一樣。

var t4 

=new

;var t5

=new

;var t6

=new

;

匿名型別是「不可變」的,也就是說匿名型別的例項是不能夠更改它的屬性的,否則會造成編譯錯誤,如:

var t4 

=new

;t4.index =11

;//引發編譯錯誤

二、隱式型別變數

隱式型別變數是用var關鍵字宣告的區域性變數,這個變數的具體型別是可以通過賦傎號右邊的表示式推導出來的。其實在大多數情況下,隱式型別變數都是為匿名型別的例項而存在的。

隱式型別變數只能用於以下的場合:

1. 區域性變數宣告

2. for、foreach 語句中變數宣告

3. using 語句初始化變數

尤其要注意的是不能在類的欄位中或方法的引數中使有隱式型別。

那麼問題是有沒有辦法在建立匿名型別的方法內部,將其實例傳到方法的外部呢?答案是肯定的,主要有兩種方法:

1.利用object引數,因為隱式型別變數可以自動轉換為objcet。

public

void

outvarinstance1(

outobject

obj)

//把匿名型別的例項傳到方法外1:使用object

;obj

=v1;

}

在這裡隱式型別變數可以自動的轉換為object型別。當然對於呼叫者而言其操作僅限於object支援的那些。

2.利用方法型別推導,匿名型別的例項以乙個方法的「型別引數」的形式來傳遞,編譯器可以推導出具體的型別。

**

public

void

outvarinstance2()

//把匿名型別的例項傳到方法外2:使用"型別引數"

;method(v2);

}public

void

method

<

t>

(t input)

",input));

}

現在在method中我們就可以對匿名型別的例項進行訪問了。

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

一 匿名型別 下面一段 展示了如何定義並且使用匿名型別 static void main string args var patent2 new var patent3 new console.writeline patent1.title,patent1.yearofpublication con...

隱式型別 型別推斷 和匿名型別

一 隱式型別 型別推斷 編譯時能確定資料型別 var 型別在編譯的時候能確定資料型別,是隱式型別,也是強型別 var s sf var i 1 var ints new int var t 報錯,編譯的時候不能推斷出型別 以上都是型別推斷。二 匿名型別 var ints new 1 var car ...

C 隱式型別

隱式型別 1 源起 在隱式型別出現之前,我們在宣告乙個變數的時候,總是要為乙個變數指定他的型別 甚至在foreach乙個集合的時候,也要為遍歷的集合的元素,指定變數的型別 隱式型別的出現,程式設計師就不用再做這個工作了。2 使用方法 來看下面的 var a 1 int a 1 var b 123 s...