前言:最近園子裡面大談程式設計師基礎知識的文章,基礎知識的重要性無需多論了。看到大家對基礎知識的評論後突然想到這麼一個場景。曾經有個同事問我:有一個匿名物件想做為一個函式的返回值,可以麼?我當時堅定的回答---不可以。而他也深信不疑,似乎真的實現不了。如果我沒記錯的話當時是.NET3.5環境,如果當時是.NET4.0的話我就大錯特錯了。
開始切入主題,我對.NET 匿名物件的認識如下:
一、.NET3.5時代開始引入匿名物件概念
.NET3.0 時,微軟加入了匿名物件到.net 中。javascript. 程式設計師對匿名物件並不陌生。但是對於當時的.NET程式設計師而言,應該屬於一個新鮮事物。.NET4.0可以讓我們例項化物件而不需要為該物件定義類。如何理解“例項化物件而不需要為該物件定義類”,還是用程式碼來解釋吧:
1 |
private static Object GetAnonymousObj() |
3 |
Object anonymousObj = new { UserName = "admin", Password = "1111" }; |
這裡並未在例項化物件前為anonymousObj物件建立相關的類,所以稱anonymousObj物件為匿名物件。
二、.NET 4.0中將匿名物件作為函式返回值
回到本文開頭引入的前言部分-- 匿名物件可以作為函式返回值麼?在.NET4.0中這個已經成為現實。
請看一下程式碼範例,將匿名物件作為返回值:
1 |
private static Object GetAnonymousObj() |
3 |
Object anonymousObj = new { UserName = "admin", Password = "1111" }; |
很簡單的一段程式碼,讓我們將anonymousObj這個匿名物件作為了函式返回值。但是在呼叫該函式時發現了問題,我們沒法這樣做:
Object bj = GetAnonymousObj();
Console.WriteLine(obj.UserName); // 這裡將無法編譯。因為obj物件是Object型別。
因此在.net3.5時,我告訴同事這個還是不要這樣實現的好。換個方法吧?當.NET4.0時代來臨時,我們的問題得到妥善的解決 ---- 首先由Dynamic 型別隆重登場:(Dynamic簡單介紹)
先將上文中的GetAnonymousObj函式改造成返回dynamic 型別:
1 |
private static dynamic GetAnonymousObj() |
3 |
dynamic anonymousObj = new { UserName = "admin", Password = "1111" }; |
接著呼叫GetAnonymousObj()方法:
1 |
static void Main(string[] args) |
3 |
dynamic o = GetAnonymousObj(); |
4 |
Console.WriteLine(o.UserName); |
輸出>>admin.
匿名物件也許在您的專案中運用的並不是很多,但我的專案大部分是建立在LinqToSQL的基礎上,所以我們常常會寫出這樣的程式碼:在LINQ查詢語句中使用匿名物件。比如:
1 |
var user = from user in Users |
2 |
select new { user.Name, user.Id} //匿名物件 |
三、.NET中匿名物件的其他注意事項
- 在同一個程式集內,兩個匿名物件具有相同的屬性、相同的屬性順序。編譯器將認為這兩個匿名物件是相同的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-681742/,如需轉載,請註明出處,否則將追究法律責任。