サーチ…
匿名型の作成
匿名型は名前が付けられないので、これらの型の変数は暗黙的に型付けされなければなりません( var
)。
var anon = new { Foo = 1, Bar = 2 };
// anon.Foo == 1
// anon.Bar == 2
メンバ名が指定されていない場合は、オブジェクトを初期化するために使用されるプロパティ/変数の名前に設定されます。
int foo = 1;
int bar = 2;
var anon2 = new { foo, bar };
// anon2.foo == 1
// anon2.bar == 2
匿名型宣言の式が単純なプロパティアクセスの場合にのみ、名前を省略することができます。メソッド呼び出しや複雑な式の場合は、プロパティ名を指定する必要があります。
string foo = "some string";
var anon3 = new { foo.Length };
// anon3.Length == 11
var anon4 = new { foo.Length <= 10 ? "short string" : "long string" };
// compiler error - Invalid anonymous type member declarator.
var anon5 = new { Description = foo.Length <= 10 ? "short string" : "long string" };
// OK
匿名と動的
匿名型では、静的型チェックを維持しながら、型を事前に明示的に定義することなくオブジェクトを作成することができます。
var anon = new { Value = 1 };
Console.WriteLine(anon.Id); // compile time error
逆に、 dynamic
にはコンパイル時エラーの代わりに実行時エラーを選択する動的型チェックがあります。
dynamic val = "foo";
Console.WriteLine(val.Id); // compiles, but throws runtime error
匿名型を持つ一般的なメソッド
一般的なメソッドでは、型の推論を通じて匿名型を使用できます。
void Log<T>(T obj) {
// ...
}
Log(new { Value = 10 });
これは、LINQ式を匿名型で使用できることを意味します。
var products = new[] {
new { Amount = 10, Id = 0 },
new { Amount = 20, Id = 1 },
new { Amount = 15, Id = 2 }
};
var idsByAmount = products.OrderBy(x => x.Amount).Select(x => x.Id);
// idsByAmount: 0, 2, 1
匿名型を持つジェネリック型のインスタンス化
ジェネリックコンストラクタを使用するには、匿名型の名前を付ける必要がありますが、これは不可能です。あるいは、汎用的な方法を使用して型推論を行うことができる。
var anon = new { Foo = 1, Bar = 2 };
var anon2 = new { Foo = 5, Bar = 10 };
List<T> CreateList<T>(params T[] items) {
return new List<T>(items);
}
var list1 = CreateList(anon, anon2);
List<T>
の場合、暗黙的に型指定された配列は、 ToList
LINQメソッドを介してList<T>
変換できます。
var list2 = new[] {anon, anon2}.ToList();
匿名型の平等
匿名型の等値は、 Equals
インスタンスメソッドによって与えられます。 2つのオブジェクトは、すべてのプロパティに対して同じ型と等しい値( a.Prop.Equals(b.Prop)
)を持つ場合、等しいです。
var anon = new { Foo = 1, Bar = 2 };
var anon2 = new { Foo = 1, Bar = 2 };
var anon3 = new { Foo = 5, Bar = 10 };
var anon3 = new { Foo = 5, Bar = 10 };
var anon4 = new { Bar = 2, Foo = 1 };
// anon.Equals(anon2) == true
// anon.Equals(anon3) == false
// anon.Equals(anon4) == false (anon and anon4 have different types, see below)
2つの匿名型は、プロパティの名前と型が同じで、同じ順序で表示される場合に限り、同じとみなされます。
var anon = new { Foo = 1, Bar = 2 };
var anon2 = new { Foo = 7, Bar = 1 };
var anon3 = new { Bar = 1, Foo = 3 };
var anon4 = new { Fa = 1, Bar = 2 };
// anon and anon2 have the same type
// anon and anon3 have diferent types (Bar and Foo appear in different orders)
// anon and anon4 have different types (property names are different)
暗黙的に型指定された配列
匿名型の配列は、暗黙の型指定で作成することができます。
var arr = new[] {
new { Id = 0 },
new { Id = 1 }
};
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow