匿名型 (C# プログラミング ガイド)
更新 : 2008 年 7 月
匿名型を使用すると、あらかじめ明示的に型を定義することなく、一連の読み取り専用プロパティを単一のオブジェクトにカプセル化できるので便利です。型名はコンパイラによって生成され、ソース コード レベルでは利用できません。プロパティの型はコンパイラによって推論されます。Amount および Message という 2 つのプロパティを持つ匿名型を初期化する方法を次の例に示します。
var v = new { Amount = 108, Message = "Hello" };
匿名型は、通常、クエリ式の select 句で使用され、ソース シーケンス内の各オブジェクトのプロパティのサブセットを返します。クエリの詳細については、「LINQ クエリ式 (C# プログラミング ガイド)」を参照してください。
匿名型を作成するには、new 演算子とオブジェクト初期化子を使用します。オブジェクト初期化子の詳細については、「オブジェクト初期化子とコレクション初期化子 (C# プログラミング ガイド)」を参照してください。
匿名型は、1 つ以上の読み取り専用のパブリック プロパティを持つクラス型です。それ以外のクラス メンバ (メソッド、イベントなど) は使用できません。匿名型は、object 以外の型やインターフェイスにキャストすることはできません。
最も一般的な用例は、別の型の一部のプロパティを使用して匿名型を初期化することです。次の例では、Color プロパティおよび Price プロパティを持つ Product という名前のクラスがあると想定しています。このクラスには他のプロパティもありますが、他のプロパティは必要ではありません。Products は、Product オブジェクトのコレクションです。匿名型の宣言は、new キーワードで始めます。これにより、Product のプロパティのうち、2 つのプロパティだけを使用する新しい型が初期化されます。この結果、クエリで返されるデータの量が少なくなります。
匿名型のメンバ名を指定しなかった場合、コンパイラによって、初期化に使用するプロパティと同じ名前が付けられます。式で初期化するプロパティには、名前を指定する必要があります。
var productQuery =
from prod in products
select new { prod.Color, prod.Price };
foreach (var v in productQuery)
{
Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}
匿名型を変数に代入する場合は、var 構成要素を指定してその変数を初期化する必要があります。基になる匿名型の名前にアクセスできるのは、コンパイラだけであるためです。var の詳細については、「暗黙的に型指定されるローカル変数 (C# プログラミング ガイド)」を参照してください。
解説
匿名型は、object から直接派生する参照型です。コンパイラによって名前が付けられますが、アプリケーションからはアクセスできません。共通言語ランタイムから見た匿名型は、object 以外の型にキャストできないことを除き、他の参照型と同じです。
2 つ以上の匿名型においてプロパティの数、型、および順序が同じである場合、コンパイラはこれらの匿名型を同じ型として扱います。これらの匿名型は、コンパイラにより生成された同じ型情報を共有することになります。
匿名型には、メソッドのスコープがあります。匿名型、または匿名型のコレクションを渡すには、メソッドの範囲の外側で型を object にあらかじめキャストしておく必要があります。ただし、これにより、匿名型の厳密な型指定の機能を損なうことになります。クエリ結果をメソッドの範囲外に渡すか、または保存する必要がある場合は、匿名型ではなく、通常の名前付き構造体またはクラスを使用することを検討してください。
匿名型は、安全でない型をプロパティとして持つことができません。
匿名型の Equals メソッドおよび GetHashCode メソッドは、プロパティの Equals と GetHashcode に関して定義されています。このため、同じ匿名型の 2 つのインスタンスは、すべてのプロパティが等しい場合のみ、等しいと見なされます。
参照
概念
参照
オブジェクト初期化子とコレクション初期化子 (C# プログラミング ガイド)
その他の技術情報
履歴の変更
日付 |
履歴 |
理由 |
---|---|---|
2008 年 7 月 |
概要のテキストと「解説」にキャストの制限事項に関する情報を追加 |
情報の拡充 |