轉(zhuǎn)帖|其它|編輯:郝浩|2010-12-14 14:01:13.000|閱讀 596 次
概述:最近園子里面大談程序員基礎(chǔ)知識的文章,基礎(chǔ)知識的重要性無需多論了。看到大家對基礎(chǔ)知識的評論后突然想到這么一個(gè)場景。曾經(jīng)有個(gè)同事問我:有一個(gè)匿名對象想做為一個(gè)函數(shù)的返回值,可以么?我當(dāng)時(shí)堅(jiān)定的回答---不可以。而他也深信不疑,似乎真的實(shí)現(xiàn)不了。如果我沒記錯(cuò)的話當(dāng)時(shí)是.NET3.5環(huán)境,如果當(dāng)時(shí)是.NET4.0的話我就大錯(cuò)特錯(cuò)了。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
最近園子里面大談程序員基礎(chǔ)知識的文章,基礎(chǔ)知識的重要性無需多論了。看到大家對基礎(chǔ)知識的評論后突然想到這么一個(gè)場景。曾經(jīng)有個(gè)同事問我:有一個(gè)匿名對象想做為一個(gè)函數(shù)的返回值,可以么?我當(dāng)時(shí)堅(jiān)定的回答---不可以。而他也深信不疑,似乎真的實(shí)現(xiàn)不了。如果我沒記錯(cuò)的話當(dāng)時(shí)是.NET3.5環(huán)境,如果當(dāng)時(shí)是.NET4.0的話我就大錯(cuò)特錯(cuò)了。
開始切入主題,我對.NET 匿名對象的認(rèn)識如下:
一、.NET3.5時(shí)代開始引入匿名對象概念
.NET3.0 時(shí),微軟加入了匿名對象到.net 中。javascript 程序員對匿名對象并不陌生。但是對于當(dāng)時(shí)的.NET程序員而言,應(yīng)該屬于一個(gè)新鮮事物。.NET4.0可以讓我們實(shí)例化對象而不需要為該對象定義類。如何理解"實(shí)例化對象而不需要為該對象定義類",還是用代碼來解釋吧:
private static Object GetAnonymousObj()
{
Object anonymousObj = new { UserName = "admin", Password = "1111" };
return anonymousObj;
}
這里并未在實(shí)例化對象前為anonymousObj對象建立相關(guān)的類,所以稱anonymousObj對象為匿名對象。
二、.NET 4.0中將匿名對象作為函數(shù)返回值
回到本文開頭引入的前言部分-- 匿名對象可以作為函數(shù)返回值么?在.NET4.0中這個(gè)已經(jīng)成為現(xiàn)實(shí)。
請看一下代碼范例,將匿名對象作為返回值:
private static Object GetAnonymousObj()
{
Object anonymousObj = new { UserName = "admin", Password = "1111" };
return anonymousObj;
}
很簡單的一段代碼,讓我們將anonymousObj這個(gè)匿名對象作為了函數(shù)返回值。但是在調(diào)用該函數(shù)時(shí)發(fā)現(xiàn)了問題,我們沒法這樣做:
Object obj = GetAnonymousObj();
Console.WriteLine(obj.UserName); // 這里將無法編譯。因?yàn)閛bj對象是Object類型。
因此在.net3.5時(shí),我告訴同事這個(gè)還是不要這樣實(shí)現(xiàn)的好。換個(gè)方法吧?當(dāng).NET4.0時(shí)代來臨時(shí),我們的問題得到妥善的解決 ---- 首先由Dynamic 類型隆重登場:(Dynamic簡單介紹)
先將上文中的GetAnonymousObj函數(shù)改造成返回dynamic 類型:
private static dynamic GetAnonymousObj()
{
dynamic anonymousObj = new { UserName = "admin", Password = "1111" };
return anonymousObj;
}
接著調(diào)用GetAnonymousObj()方法:
static void Main(string[] args)
{
dynamic o = GetAnonymousObj();
Console.WriteLine(o.UserName);
Console.ReadKey();
}
輸出>>admin.
匿名對象也許在您的項(xiàng)目中運(yùn)用的并不是很多,但我的項(xiàng)目大部分是建立在LinqToSQL的基礎(chǔ)上,所以我們常常會(huì)寫出這樣的代碼:在LINQ查詢語句中使用匿名對象。
比如:
var user = from user in Users
select new { user.Name, user.Id} //匿名對象
三、.NET中匿名對象的其他注意事項(xiàng)
匿名對象繼承于System.Object。
匿名對象屬性均為只讀屬性(ReadOnly)。
在同一個(gè)程序集內(nèi),兩個(gè)匿名對象具有相同的屬性、相同的屬性順序。編譯器將認(rèn)為這兩個(gè)匿名對象是相同的。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載