在查阅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
匿名类型是强类型的。从公共语言运行时的角度来看,匿名类型与任何其他引用类型没有区别。
如果同一程序集中有两个或更多具有相同数量和类型属性、以相同顺序排列的匿名类型,则编译器将它们视为相同的类型。它们共享相同的编译器生成的类型信息。
不应将匿名类型在程序集之间传递,甚至不应将其作为方法的返回值传递(虽然可能,但极少建议这样做)。
匿名类型是一种方便机制,例如在使用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
和匿名类型来表示许多方法重载中的相同信息。
为什么变量不需要类型定义,甚至不需要var?
值类型是被推断出来的,但是推断并不总是可能的:http://msdn.microsoft.com/en-us/library/bb531357.aspx(如果有人知道C#等效的URL,请更新)
这是匿名类型。这意味着它返回具有foo
属性和baz
属性的字符串类型的内容。