9

在浏览 ASP.NET MVC 文档时,我看到这个成语被大量使用:

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

这是字典文字语法吗?它是具有被调用函数定义推断的类型的新类/结构吗?如果是为什么 vars 不需要类型定义,甚至不需要var

4

3 回答 3

14

这是一个匿名类型。

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

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 MVCRouteValueDictionary在许多方法重载中使用匿名类型来表示相同的信息。

为什么 vars 不需要类型定义,甚至 var 都不需要?

推断值类型,但推断并非总是可能的:http: //msdn.microsoft.com/en-us/library/bb531357.aspx (VB 版本,如果有人知道 c# 等效项的 URL,请更新)

于 2012-10-05T03:28:21.950 回答
4

这是一种匿名类型语法。类型名称由编译器生成,在源代码级别不可用。每个属性的类型由编译器推断。

于 2012-10-05T03:28:07.820 回答
2

这是匿名类型。这意味着它返回的东西有一个foo属性,一个baz字符串类型的属性。

于 2012-10-05T03:28:56.120 回答