在C#中,没有类名的new关键字是什么意思?

10

在查阅ASP.NET MVC文档时,我看到这个习语被频繁使用:

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

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

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

为什么变量不需要类型定义,甚至不需要var?

值类型是被推断出来的,但是推断并不总是可能的:http://msdn.microsoft.com/en-us/library/bb531357.aspx(如果有人知道C#等效的URL,请更新)


1
我们将能够在C# 9中创建没有类型的对象。https://stackoverflow.com/a/62373905/6527049 - Vivek Nuna

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

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接