簡體   English   中英

在C#中應如何使用匿名類型?

[英]How should anonymous types be used in C#?

我已經看到了很多關於匿名類型如何工作的描述,但是我不確定它們是否真正有用。 在精心設計的程序中可以使用匿名類型解決哪些方案?

匿名類型與系統的設計甚至在類級別都沒有關系。 它們是開發人員在編碼時使用的工具。

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

例如:

var query = from item in database.Items
            // ...
            select new { Id = item.Id, Name = item.Name };

return query.ToDictionary(item => item.Id, item => item.Name);

沒有人關心`a,匿名類型。 它在那里,所以您不必聲明另一個類。

從運行中的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);

匿名類型最流行的用途是在LINQ to SQL查詢中指定投影。

這個查詢

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

將轉換為以下SQL:

SELECT Column1, Column2 AS Alias2 FROM Table1

使用匿名類型,您可以創建臨時投影而無需事先為其定義類型。 編譯器將為您定義類型。

為“使用和拋出”目的創建類型時。 這似乎是由於LINQ造成的。 似乎是一種動態創建具有LINQ查詢字段的結構的方法。 僅返回具有指定字段的結構/類型。 如果不是這樣,則必須為每個要檢索的字段的唯一組合聲明一個.Net類型。

與Linq一起使用。

重要的是要知道,LINQ不會強迫您使用匿名類型。 選擇后還可以編寫普通的對象構造。

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

這可以防止您進行丑陋的反射編程。

@Wouter:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM