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

匿名型を使用すると、あらかじめ明示的に型を定義することなく、一連の読み取り専用プロパティを単一のオブジェクトにカプセル化できるので便利です。Anonymous types provide a convenient way to encapsulate a set of read-only properties into a single object without having to explicitly define a type first. 型の名前はコンパイラにより生成され、ソース コード レベルでは使用できません。The type name is generated by the compiler and is not available at the source code level. 各プロパティの型はコンパイラにより推測されます。The type of each property is inferred by the compiler.

匿名型を作成するには、new 演算子をオブジェクト初期化子と一緒に使用します。You create anonymous types by using the new operator together with an object initializer. オブジェクト初期化子の詳細については、「オブジェクト初期化子とコレクション初期化子」を参照してください。For more information about object initializers, see Object and Collection Initializers.

次の例では、Amount および Message という名前の 2 つのプロパティがある、初期化される匿名型を示します。The following example shows an anonymous type that is initialized with two properties named Amount and Message.

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 句で使用され、ソース シーケンスの各オブジェクトからプロパティのサブセットを返します。Anonymous types typically are used in the select clause of a query expression to return a subset of the properties from each object in the source sequence. クエリの詳細については、「LINQ クエリ式」を参照してください。For more information about queries, see LINQ Query Expressions.

匿名型には、読み取り専用パブリック プロパティが 1 つ以上含まれます。Anonymous types contain one or more public read-only properties. それ以外のクラス メンバー (メソッドやイベントなど) は無効です。No other kinds of class members, such as methods or events, are valid. プロパティの初期化に使用される式に、null、匿名関数、ポインター型を指定することはできません。The expression that is used to initialize a property cannot be null, an anonymous function, or a pointer type.

最も一般的な用例は、別の型のプロパティを使用して匿名型を初期化することです。The most common scenario is to initialize an anonymous type with properties from another type. 次の例では、Product という名前のクラスが存在すると仮定します。In the following example, assume that a class exists that is named Product. Product クラスには、さまざまなプロパティが含まれますが、ここで注目するのは ColorPrice プロパティです。Class Product includes Color and Price properties, together with other properties that you are not interested in. 変数 products は、Product オブジェクトのコレクションです。Variable products is a collection of Product objects. 匿名型の宣言は、new キーワードで始まります。The anonymous type declaration starts with the new keyword. この宣言により、Product の 2 つのプロパティだけを使用する新しい型が初期化されます。The declaration initializes a new type that uses only two properties from Product. この結果、クエリに返されるデータの量が少なくなります。This causes a smaller amount of data to be returned in the query.

匿名型のメンバー名を指定しない場合、コンパイラは初期化に使用されるプロパティと同じ名前を匿名型メンバーに付けます。If you do not specify member names in the anonymous type, the compiler gives the anonymous type members the same name as the property being used to initialize them. 前の例で示されているように、式を使用して初期化されるプロパティの名前を指定する必要があります。You must provide a name for a property that is being initialized with an expression, as shown in the previous example. 次の例では、ColorPrice が匿名型のプロパティの名前になっています。In the following example, the names of the properties of the anonymous type are Color and 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 を使用することにより、変数を暗黙的に型指定したローカル変数として宣言します。Typically, when you use an anonymous type to initialize a variable, you declare the variable as an implicitly typed local variable by using var. コンパイラだけが匿名型の基になる名前にアクセスできるため、変数宣言では型の名前を指定できません。The type name cannot be specified in the variable declaration because only the compiler has access to the underlying name of the anonymous type. var の詳細については、「暗黙的に型指定されたローカル変数」を参照してください。For more information about var, see Implicitly Typed Local Variables.

次の例に示すように、暗黙的に型指定されたローカル変数と暗黙的に型指定された配列を組み合わせることにより、匿名型の要素の配列を作成できます。You can create an array of anonymously typed elements by combining an implicitly typed local variable and an implicitly typed array, as shown in the following example.

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

コメントRemarks

匿名型は object から直接派生した class 型であり、object 以外の型にキャストできません。Anonymous types are class types that derive directly from object, and that cannot be cast to any type except object. コンパイラは各匿名型に名前を付けますが、この名前にアプリケーションはアクセスできません。The compiler provides a name for each anonymous type, although your application cannot access it. 共通言語ランタイムから見た場合、匿名型と他の参照型に違いはありません。From the perspective of the common language runtime, an anonymous type is no different from any other reference type.

アセンブリ内の複数の匿名オブジェクト初期化子が、同じ順序で同じ名前や型を持つプロパティのシーケンスを指定する場合、コンパイラはそれらのオブジェクトを同じ型のインスタンスとして処理します。If two or more anonymous object initializers in an assembly specify a sequence of properties that are in the same order and that have the same names and types, the compiler treats the objects as instances of the same type. これらのオブジェクトは、コンパイラで生成された同一の型情報を共有します。They share the same compiler-generated type information.

フィールド、プロパティ、イベント、またはメソッドの戻り値の型は、匿名型を持つものとして宣言できません。You cannot declare a field, a property, an event, or the return type of a method as having an anonymous type. 同様に、メソッドの仮パラメーター、プロパティ、コンストラクター、またはインデクサーも、匿名型を持つものとして宣言できません。Similarly, you cannot declare a formal parameter of a method, property, constructor, or indexer as having an anonymous type. メソッドの引数として匿名型または匿名型を含むコレクションを渡すために、パラメーターを型オブジェクトとして宣言できます。To pass an anonymous type, or a collection that contains anonymous types, as an argument to a method, you can declare the parameter as type object. ただし、これにより厳密な型指定が無効になります。However, doing this defeats the purpose of strong typing. クエリ結果をメソッドの境界を越えて格納したり渡したりする必要がある場合、匿名型の代わりに、通常の名前の構造体またはクラスの使用を検討してください。If you must store query results or pass them outside the method boundary, consider using an ordinary named struct or class instead of an anonymous type.

匿名型の Equals メソッドと GetHashCode メソッドは、プロパティの Equals メソッドと GetHashCode メソッドとして定義されています。このため、同じ匿名型の 2 つのインスタンスは、すべてのプロパティが等しい場合のみ等しいとみなされます。Because the Equals and GetHashCode methods on anonymous types are defined in terms of the Equals and GetHashCode methods of the properties, two instances of the same anonymous type are equal only if all their properties are equal.

関連項目See Also

C# プログラミング ガイドC# Programming Guide
オブジェクト初期化子とコレクション初期化子Object and Collection Initializers
C# の LINQ の概要Getting Started with LINQ in C#
LINQ クエリ式LINQ Query Expressions