匿名型 (C# プログラミング ガイド)

更新 : 2011 年 4 月

匿名型を使用すると、あらかじめ明示的に型を定義することなく、一連の読み取り専用プロパティを単一のオブジェクトにカプセル化できるので便利です。 型名はコンパイラによって生成され、ソース コード レベルでは利用できません。 各プロパティの型はコンパイラによって推論されます。

匿名型を作成するには、new 演算子とオブジェクト初期化子を使用します。 オブジェクト初期化子の詳細については、「オブジェクト初期化子とコレクション初期化子 (C# プログラミング ガイド)」を参照してください。

Amount および Message という名前の 2 つのプロパティを持つ匿名型を初期化する方法を次の例に示します。

var v = new { Amount = 108, Message = "Hello" };

// Rest the mouse pointer over v.Amount and v.Message in the following
// statement to verify that their inferred types are int and string.
Console.WriteLine(v.Amount + v.Message);

匿名型は、通常、クエリ式の select 句で使用され、ソース シーケンス内の各オブジェクトのプロパティのサブセットを返します。 クエリの詳細については、「LINQ クエリ式 (C# プログラミング ガイド)」を参照してください。

匿名型には、読み取り専用のパブリック プロパティが 1 つ以上含まれます。 それ以外のクラス メンバー (メソッド、イベントなど) は使用できません。 プロパティの初期化に使用される式には、null、匿名関数、またはポインター型は使用できません。

最も一般的な用例は、別の型の一部のプロパティを使用して匿名型を初期化することです。 次の例では、Product という名前のクラスが存在しているものとします。 Product クラスには、さまざまなプロパティが含まれていますが、ここで注目しているのは Color プロパティと Price プロパティです。 変数 products は Product オブジェクトのコレクションです。 匿名型の宣言は、new キーワードで始めます。 この宣言により、Product のプロパティのうち、2 つのプロパティだけを使用する新しい型が初期化されます。 この結果、クエリで返されるデータの量が少なくなります。

匿名型のメンバー名を指定しなかった場合、コンパイラによって、初期化に使用するプロパティと同じ名前が付けられます。 前の例で示したように、式で初期化するプロパティには、名前を指定する必要があります。 次の例では、Color と Price が匿名型のプロパティの名前になっています。

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# プログラミング ガイド)」を参照してください。

暗黙的に型指定されたローカル変数と暗黙的に型指定された配列を次の例に示すように組み合わせることで、匿名型の要素の配列を作成できます。

var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};

解説

匿名型は、object から直接派生するクラス型です。 各匿名型の名前はコンパイラによって用意されますが、アプリケーションからはこれにアクセスできません。 共通言語ランタイムから見た匿名型は、object 以外の型にキャストできないことを除き、他の参照型と同じです。

同じアセンブリにある 2 つ以上の匿名型において、プロパティの数と型、および順序が同じである場合、コンパイラはこれらの匿名型を同じ型として扱います。 これらの匿名型は、コンパイラにより生成された同じ型情報を共有します。

匿名型では、フィールド、プロパティ、イベントを宣言できず、メソッドの戻り値の型として匿名型を指定することもできません。 同様に、メソッド、プロパティ、コンストラクター、またはインデクサーの仮パラメーターとして匿名型は宣言できません。 メソッドへの引数として匿名型、または匿名型を含んだコレクションを渡すためには、型オブジェクトとしてパラメーターを宣言できます。 ただし、これにより厳密な型指定という目的は損なわれることになります。 クエリ結果をメソッドの範囲外に渡すか、または保存する必要がある場合は、匿名型ではなく、通常の名前付き構造体またはクラスを使用することを検討してください。

匿名型の Equals メソッドおよび GetHashCode メソッドは、プロパティの Equals メソッドと GetHashcode メソッドに関して定義されています。このため、同じ匿名型の 2 つのインスタンスは、すべてのプロパティが等しい場合のみ、等しいと見なされます。

参照

参照

オブジェクト初期化子とコレクション初期化子 (C# プログラミング ガイド)

概念

C# プログラミング ガイド

LINQ クエリ式 (C# プログラミング ガイド)

その他の技術情報

C# の LINQ の概要

履歴の変更

日付

履歴

理由

2011 年 4 月

テキストを明確化。

カスタマー フィードバック