2008-09-07 39 views

回答

18

匿名類型無關使用新系統的設計甚至在課堂上都是如此。它們是開發人員在編碼時使用的工具。

我甚至不把匿名類型視爲類型本身。我主要將它們用作方法級匿名元組。如果我查詢數據庫然後處理結果,我寧願創建一個匿名類型並使用它,而不是聲明一個全新的類型,這個類型在我的方法範圍之外永遠不會被使用或知道。

例如:

​​

無人問津`一,匿名類型。它在那裏,所以你不必申報另一個班級。

+0

你是否需要這個。當然,如果你在你的方法中做了太多的工作以保證匿名類型,那麼你應該重構該方法。在你的例子中,你查詢數據庫,然後修改結果,..這是我2個不同的方法。 – Stimul8d 2010-09-10 10:29:37

+4

我沒有修改結果,我將它們轉換爲其他更容易返回的表單。 一個人應該注意不要在多個方法中過度分配他們的代碼,因爲這會使代碼完全無法讀取並創建,因爲無法使用匿名類型,很多難看的代碼或冗餘的手動編碼類型。 – 2010-09-16 19:08:59

1

當您爲「使用和拋出」目的創建類型時。 這似乎是由於LINQ引起的。似乎是一種爲LINQ查詢創建帶有字段的結構的方法。僅返回指定字段的結構/類型。如果不是這樣,你必須爲每個你希望檢索的字段的唯一組合聲明一個.Net類型。

8

從LINQ在行動(第76頁第2.6.3節):

...匿名類型[是]進行快速和簡單的臨時結果一個偉大的工具。由於臨時類型,我們不需要聲明類來保存臨時結果。

基本上它們有助於暫時將信息保存在本地作用域中。任何更多需要使用反射,並可能成爲一個相當大的問題。他們在上面引用的書中給出的例子是以書面形式來控制每個正在運行的進程佔用的內存的ID,名稱和數量。他們創建一個匿名類型,將其添加到列表(全部一條語句),然後使用ObjectDumper輸出它。因此,代碼不再需要另行申報類來保存ID,名稱和內存使用,但它的所有聲明的隱含使線倒數至4:

var pl = new List<Object>(); 
foreach(var p in Process.GetProcesses()) 
    pl.Add(new {p.Id, p.ProcessName, Memory=p.WorkingSet64}); 
ObjectDumper.Write(pl); 
2

將它們與Linq一起使用。

2

匿名類型最受歡迎的用途是用於指定LINQ to SQL查詢中的投影。

這個查詢

from x in db.Table1 select new {x.Column1, Alias2=x.Column2} 

將被轉換爲這個SQL:

SELECT Column1, Column2 AS Alias2 FROM Table1 

使用匿名類型,你可以不事先定義它的類型創建即席預測。編譯器將爲您定義類型。

0

重要的是要知道,LINQ並不強迫你使用匿名類型。選擇後,您也可以編寫普通的對象結構。

var query = from item in database.Items 
// ... 
select new Person(item.id, item.Name) 

這可以防止你從醜陋的反射編程。

-1

@Wouter:

var query = from item in database.Items 
select new Person 
{ 
ID =item.id, 
NAME= item.Name 
}; 

其中ID和NAME是你的Person類的不動產。