解釋.NET之匿名對象(AnonymousObject)
本文旨在與園有分享我對 .NET 匿名對象的認識,如果存在不足的地方歡迎指出。
前言:最近園子里面大談程序員基礎知識的文章,基礎知識的重要性無需多論了。看到大家對基礎知識的評論后突然想到這么一個場景。曾經有個同事問我:有一個匿名對象想做為一個函數的返回值,可以么?我當時堅定的回答---不可以。而他也深信不疑,似乎真的實現不了。如果我沒記錯的話當時是.NET3.5環境,如果當時是.NET4.0的話我就大錯特錯了。
開始切入主題,我對.NET 匿名對象的認識如下:
一、.NET3.5時代開始引入匿名對象概念
.NET3.0 時,微軟加入了匿名對象到.net 中。javascript 程序員對匿名對象并不陌生。但是對于當時的.NET程序員而言,應該屬于一個新鮮事物。.NET4.0可以讓我們實例化對象而不需要為該對象定義類。如何理解“實例化對象而不需要為該對象定義類”,還是用代碼來解釋吧:
- private static Object GetAnonymousObj()
- {
- Object anonymousObj = new { UserName = "admin", Password = "1111" };
- return anonymousObj;
- }
這里并未在實例化對象前為anonymousObj對象建立相關的類,所以稱anonymousObj對象為匿名對象。
二、.NET 4.0中將匿名對象作為函數返回值
回到本文開頭引入的前言部分-- 匿名對象可以作為函數返回值么?在.NET4.0中這個已經成為現實。
請看一下代碼范例,將匿名對象作為返回值:
- private static Object GetAnonymousObj()
- {
- Object anonymousObj = new { UserName = "admin", Password = "1111" };
- return anonymousObj;
- }
很簡單的一段代碼,讓我們將anonymousObj這個匿名對象作為了函數返回值。但是在調用該函數時發現了問題,我們沒法這樣做:
- Object obj = GetAnonymousObj();
- Console.WriteLine(obj.UserName); // 這里將無法編譯。因為obj對象是Object類型。
因此在.net3.5時,我告訴同事這個還是不要這樣實現的好。換個方法吧?當.NET4.0時代來臨時,我們的問題得到妥善的解決 ---- 首先由Dynamic 類型隆重登場:(Dynamic簡單介紹)
先將上文中的GetAnonymousObj函數改造成返回dynamic 類型:
- private static dynamic GetAnonymousObj()
- {
- dynamic anonymousObj = new { UserName = "admin", Password = "1111" };
- return anonymousObj;
- }
接著調用GetAnonymousObj()方法:
- static void Main(string[] args)
- {
- dynamic o = GetAnonymousObj();
- Console.WriteLine(o.UserName);
- Console.ReadKey();
- }
輸出>>admin.
匿名對象也許在您的項目中運用的并不是很多,但我的項目大部分是建立在LinqToSQL的基礎上,所以我們常常會寫出這樣的代碼:在LINQ查詢語句中使用匿名對象。比如:
view sourceprint?1 var user = from user in Users
2 select new { user.Name, user.Id} //匿名對象
三、.NET中匿名對象的其他注意事項
匿名對象繼承于System.Object。
匿名對象屬性均為只讀屬性(ReadOnly)。
在同一個程序集內,兩個匿名對象具有相同的屬性、相同的屬性順序。編譯器將認為這兩個匿名對象是相同的。
最后希望本篇文章可以給您帶來幫助,如有不足之處歡迎指出,謝謝!
原文鏈接:http://www.cnblogs.com/ryanding/archive/2010/12/14/1904374.html
【編輯推薦】