質問

匿名型がどのように機能するかという説明をたくさん見てきましたが、匿名型が実際にどのように役立つのかはわかりません。適切に設計されたプログラムで匿名型を使用して対処できるシナリオにはどのようなものがありますか?

役に立ちましたか?

解決

匿名型は、システムの設計やクラス レベルとは何の関係もありません。これらは開発者がコーディング時に使用するツールです。

私は匿名型をそれ自体の型としてさえ扱いません。私は主にメソッドレベルの匿名タプル​​として使用します。データベースにクエリを実行して結果を操作する場合、メソッドの範囲外では使用されたり知られたりすることのないまったく新しい型を宣言するよりも、匿名型を作成してそれを使用する方がよいでしょう。

例えば:

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、名前、実行中の各プロセスが占有するメモリ量をコンソールに記録するために書かれています。匿名型を作成し、それをリスト (すべて 1 つのステートメント) に追加し、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 では匿名型の使用が強制されないことを知っておくことが重要です。select の後に通常のオブジェクト構造を記述することもできます。

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

これにより、醜いリフレクション プログラミングが防止されます。

@ワウター:

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

ここで、ID と NAME は Person クラスの実際のプロパティです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top