ASP.NET MVCドキュメントを調べていると、このイディオムが頻繁に使用されていることがわかります。
new { foo = "bar", baz = "foo" }
これは辞書リテラル構文ですか?呼び出された関数定義によって推測された型の新しいクラス/構造体ですか?どうして変数は型定義を必要としないのvar
でしょうか?
ASP.NET MVCドキュメントを調べていると、このイディオムが頻繁に使用されていることがわかります。
new { foo = "bar", baz = "foo" }
これは辞書リテラル構文ですか?呼び出された関数定義によって推測された型の新しいクラス/構造体ですか?どうして変数は型定義を必要としないのvar
でしょうか?
これは匿名タイプです。
匿名型は、最初に型を明示的に定義することなく、読み取り専用プロパティのセットを単一のオブジェクトにカプセル化する便利な方法を提供します。タイプ名はコンパイラによって生成され、ソースコードレベルでは使用できません。各プロパティのタイプは、コンパイラによって推測されます。
http://msdn.microsoft.com/en-us/library/bb397696.aspx
匿名型は強く型付けされています。共通言語ランタイムの観点からは、匿名型は他の参照型と同じです。
同じアセンブリ内の2つ以上の匿名型が同じ数と型のプロパティを同じ順序で持っている場合、コンパイラはそれらを同じ型として扱います。それらは、コンパイラによって生成された同じ型情報を共有します。
匿名タイプは、アセンブリ間で、またはメソッドからの戻り値としても渡さないでください(可能ですが、まれに、めったに推奨されません)。
匿名型は便利なメカニズムです。たとえば、次のプロジェクションなど、LINQを使用する場合です。
LINQの例
var result = myEnumerable.Select( o => new { foo = o.Foo, bar = o.Bar } );
// "result" is an enumerable of a new anonymous type containing two properties
その他の質問
これは辞書リテラル構文ですか?
いいえ、多くの類似点がありますが。ASP .Net MVCはRouteValueDictionary
、匿名型を使用して、多くのメソッドのオーバーロードで同じ情報を表します。
どうしてvarsは型定義を必要とせず、varさえも必要としないのですか?
値の型は推測されますが、推測が常に可能であるとは限りません。http: //msdn.microsoft.com/en-us/library/bb531357.aspx (VBバージョン、c#に相当するURLを知っている場合は更新してください)
これは匿名型の構文です。タイプ名はコンパイラによって生成され、ソースコードレベルでは使用できません。各プロパティのタイプは、コンパイラによって推測されます。
これは匿名タイプです。つまり、文字列型の両方のプロパティを持つfoo
プロパティを返すものを返しているということです。baz