在C#中引入了Linq使得對集合的操縱發生了深刻的變化這個變化的幕後英雄便是擴展方法和匿名類型這裡我們談一談C#中的匿名類型與隱式類型變量
一匿名類型
所謂匿名類型顧名思義就是沒有類型名稱的一種特殊的數據類型這意味著我們不能顯式的引用這種類型的名稱事實上它是由編譯器在後台聲明並幫你生成必要的代碼
代碼
class Program
{
public static void Main(string[] args)
{
var T = new {Index = Name = CPUPrice = };
var T = new {Index = Name = MethodBoardPrice = };
var T = new {TIndex Name = SoundCardPrice = };
}
}
以上我們用var 聲明了個隱式類型的變量TTT並把創建(new)的個匿名類型的實例分別賦給它們在這裡var相當於一個占位符其變量(TTT)的具體的類型是在代碼編譯時確定的也就是說由賦給它們的值的數據類型而定的因而在最終生成的CIL中TTT是有具體的類型的也就是強類型的
在上例中我們可以看到T中使用了T的屬性Index這說明匿名類型的屬性是完全可以訪問的它們使用了相同的屬性名稱屬性的數據類型也相同並且屬性的的順序也是一致的因而它們具有相同的類型否則就不是兼容的類型了
如以下均不是相同的類型了其中T與T的屬性不同T與T的屬性順序不一樣
var T = new {Index = Name = CPUPrice = };
var T = new {Index = Title = MethodBoardPrice = };
var T = new {TIndex Price = Name = SoundCard };
匿名類型是不可變的也就是說匿名類型的實例是不能夠更改它的屬性的否則會造成編譯錯誤如
var T = new {Index = Name = CPUPrice = };
TIndex = ;//引發編譯錯誤
二隱式類型變量
隱式類型變量是用var關鍵字聲明的局部變量這個變量的具體類型是可以通過賦傎號右邊的表達式推導出來的其實在大多數情況下隱式類型變量都是為匿名類型的實例而存在的
隱式類型變量只能用於以下的場合
局部變量聲明
forforeach 語句中變量聲明
using 語句初始化變量
尤其要注意的是不能在類的字段中或方法的參數中使有隱式類型
那麼問題是有沒有辦法在創建匿名類型的方法內部將其實例傳到方法的外部呢?答案是肯定的主要有兩種方法
利用object參數因為隱式類型變量可以自動轉換為objcet
public void OutVarInstance(out object obj)//把匿名類型的實例傳到方法外使用object
{
var v = new
{
Name = ZYS
Type = CEO
};
obj=v;
}
在這裡隱式類型變量可以自動的轉換為object類型當然對於調用者而言其操作僅限於object支持的那些
利用方法類型推導匿名類型的實例以一個方法的類型參數的形式來傳遞編譯器可以推導出具體的類型
代碼
public void OutVarInstance()//把匿名類型的實例傳到方法外使用類型參數
{
var v = new {Title = Text = Ok};
Method(v);
}
public void Method<T>(T input)
{
ConsoleWriteLine(stringFormat(Text out {}input));
}
現在在Method中我們就可以對匿名類型的實例進行訪問了
From:http://tw.wingwit.com/Article/program/net/201311/12424.html