new() 和 new class() C 之间的区别#

Difference between new() and new class() C#

提问人:Dane 提问时间:10/2/2023 最后编辑:Some programmer dudeDane 更新时间:10/2/2023 访问量:126

问:

new() 和 new class() 有什么区别,因为两者似乎都没有区别。

Human John = new();

Human John = new Human();

假设在这种情况下它没有任何区别,谁能提供一个例子,这两种情况都会导致每个代码的不同输出。谢谢!

C# 对象 方法

评论

4赞 Eldar 10/2/2023
不,它不会产生不同的结果,它们是一样的,它只是一个句法糖。文档
1赞 Jimi 10/2/2023
新运算符(目标类型 - C# 9)
6赞 Dai 10/2/2023
谁能提供一个例子,说明这两种情况会导致每个代码的不同输出”——这并不完全是“差异”,但这些例子都不会编译:和 .var x = new();ISomeInterface x = new()
1赞 Sweeper 10/2/2023
补充 Dai 的评论,如果编译器无法确定要实例化的类型,基本上你就不能使用。另请参阅这篇文章,它显示了另一种这样的情况。new()
0赞 ProgrammingLlama 10/2/2023
这是句法糖:sharplab.io/......

答:

1赞 V0ldek 10/2/2023 #1

没有区别。第一个截断使用目标类型的 new,它允许您省略类的名称(如果已知)。

已知基本上意味着可以从左侧的类型中明确推断出它。在本例中,您显式编写了 ,因此编译器会自动推断您要创建 的实例。Human JohnHuman

然而,这背后的整个目的就是没有区别。这种行为永远不应该令人惊讶。这只是较短的语法,没有功能差异。

8赞 Sweeper 10/2/2023 #2

你问 和 之间的区别。目前尚不清楚指的是什么。哪个班级?new()new class()class

如果它可以是任何类,那么 和 将产生不同输出的微不足道的情况是 when 是您要分配它的类型的派生类。 将创建一个 的实例,并将创建一个新的 .new()new class()classobject x = new();objectobject x = new StringBuilder();StringBuilder

如果您的意思是必须与要分配给的类型相同,那么当您分配给可为 null 的类型时,会产生不同的输出。classnew()new class()

int? x = new(); // same as int? x = 0;
int? x = new int?(); // same as int? x = null;

因为在这种情况下,目标类型是不可为 null 的类型。int

另请注意,有时您分配到的类型无法使用语法实例化 - 例如,当它是接口、抽象类、数组类型等时。在这些情况下,也行不通。new class()new()

在某些情况下,对于某些人来说,不会编译,但会编译。例如,其中需要第一个参数的类型来推断类型参数。这些不起作用,因为编译器无法确定应该实例化哪种类型。在这个问题中,另请参阅一个有趣的案例。new()new class()classvar x = new();SomeGenericMethod(new())SomeGenericMethodnew()

规范草案中了解有关 (又称目标类型表达式)的更多信息。new()new

评论

0赞 V0ldek 10/2/2023
您可以使用 both 和 target-typed 实例化元组类型:sharplab.io/#gist:decee6f132b1b8149e00c2a4b27e0ec8newnew ValueTuple<...>new
0赞 V0ldek 10/2/2023
此外,“不能使用语法实例化 - 例如 (...)在这些情况下,数组类型 (...) 也不起作用。您可以使用 target-typed 实例化数组,因此这是不准确的。new class()new()new
1赞 Sweeper 10/2/2023
@V0ldek意思?这是一种不同的表达方式,而不是这个问题的意义所在。 当然不编译。new[]int[] x = new();
0赞 V0ldek 10/2/2023
好吧,你是对的,这是与目标类型不同的功能。因为它确实明确给出了 CS8752,因此类型“int[]”不能用作 .我想这是有道理的,它没有办法知道大小。int[] x = new()new()
0赞 Sweeper 10/2/2023
@V0ldek元组的情况很有趣。我没想到会这样,因为规范草案说元组不允许作为目标类型。也许后来改变了。