c#中没有类名的新关键字

时间:2012-10-05 03:25:37

标签: c#

在浏览ASP.NET MVC文档时,我看到这个习惯用法很多:

new { foo = "bar", baz = "foo" }

这是字典文字语法吗? 它是一个新的类/结构,其类型由被调用的函数定义推断出来? 如果是这样的话,变量不需要类型定义,甚至不需要var

3 个答案:

答案 0 :(得分:10)

这是一种匿名类型。

  

匿名类型提供了一种封装一组的便捷方法   只读属性到单个对象而不必显式   首先定义一个类型。类型名称由编译器生成,并且是   在源代码级别不可用。每个属性的类型是   由编译器推断。

http://msdn.microsoft.com/en-us/library/bb397696.aspx

  • 匿名类型是强类型的。从公共语言运行库的角度来看,匿名类型与任何其他引用类型没有区别。

  • 如果同一程序集中的两个或多个匿名类型具有相同的属性数量和类型,则编译器将按相同的顺序将它们视为相同的类型。它们共享相同的编译器生成的类型信息。

  • 不应在程序集之间传递匿名类型,甚至不能在方法中传递return values(可能,但很少,很少建议)。

  • 匿名类型是一种便利机制,例如:使用LINQ时,例如以下projection

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 (VB版,如果有人知道c#等效的URL请更新)

答案 1 :(得分:4)

这是anonymous type syntax。类型名称由编译器生成,在源代码级别不可用。每个属性的类型由编译器推断。

答案 2 :(得分:2)

这是匿名类型。这意味着它返回的内容具有foo属性,baz属性都是字符串类型。