3. 匿名方法機理
上面介紹了我們應當怎樣使用匿名類型,下面我們通過閱讀一些IL代碼來看看編譯器究竟為我們做了哪些工作。下面的代碼演示了一個簡單的匿名類型和匿名類型變量的調用,我們來看看編譯器是怎麼處理的。
namespace AnonymousTest
{
class UserInfo
{
public string firstname;
public string lastname;
public int age;
public string address;
//...
}
class Program
{
static void Main(string[] args)
{
List<UserInfo> infoList = new List<UserInfo>();
var result = from userinfo in infoList
where userinfo.age > 20 && userinfo.age < 35
select new { userinfo.firstname, userinfo.lastname };
foreach (var var_info in result)
{
Console.WriteLine(var_info.firstname + " " + var_info.lastname);
}
}
}
}
很簡單的一段代碼,首先我們定義了一個UserInfo類,其中定義了一些屬性,firstname,lastname等等,這裡為了簡單,我們直接使用公有變量,而不使用屬性來表示了。接下來就是我們的Program類,在這個類中我們定義了集合變量,由於這裡僅僅為了做演示,所以實際上我並沒與往集合中添加成員,但已足夠讓CLR生成它的結構然後我們定義了result變量去取得它的檢索結果,注意我們返回的是一個匿名類型。接著我們使用freach循環將其打印出來。
下面我們打開VS的命令行窗口,輸入命令ildasm,在打開的窗口中,選擇File->Open打開我們編譯好的文件,大家會看到如下界面:
大家可以看到,CLR在IL層實際上是為我們新建了一個特殊的類,其中包含了firstname, secondname的屬性,當然與之對應的還定義了一些set,get方法,此外,CLR還為這個類額外重載了以下方法,像Equals,ToString等等。這樣我們定義的一些匿名類型就能夠被編譯器所識別出來。
以上只是對匿名類型做了一個簡單的介紹,有興趣的朋友們可以從兩方面繼續研究它,一方面是工程上的應用,一方面繼續探索IL代碼的密碼,無論是哪一個方面,我想你都會有很大收獲的。