提问人:Dane 提问时间:10/2/2023 最后编辑:Some programmer dudeDane 更新时间:10/2/2023 访问量:126
new() 和 new class() C 之间的区别#
Difference between new() and new class() C#
问:
new() 和 new class() 有什么区别,因为两者似乎都没有区别。
Human John = new();
或
Human John = new Human();
假设在这种情况下它没有任何区别,谁能提供一个例子,这两种情况都会导致每个代码的不同输出。谢谢!
答:
没有区别。第一个截断使用目标类型的 new
,它允许您省略类的名称(如果已知)。
已知基本上意味着可以从左侧的类型中明确推断出它。在本例中,您显式编写了 ,因此编译器会自动推断您要创建 的实例。Human John
Human
然而,这背后的整个目的就是没有区别。这种行为永远不应该令人惊讶。这只是较短的语法,没有功能差异。
你问 和 之间的区别。目前尚不清楚指的是什么。哪个班级?new()
new class()
class
如果它可以是任何类,那么 和 将产生不同输出的微不足道的情况是 when 是您要分配它的类型的派生类。 将创建一个 的实例,并将创建一个新的 .new()
new class()
class
object x = new();
object
object x = new StringBuilder();
StringBuilder
如果您的意思是必须与要分配给的类型相同,那么当您分配给可为 null 的类型时,会产生不同的输出。class
new()
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()
class
var x = new();
SomeGenericMethod(new())
SomeGenericMethod
new()
在规范草案中了解有关 (又称目标类型表达式)的更多信息。new()
new
评论
new
new ValueTuple<...>
new
new class()
new()
new
new[]
int[] x = new();
int[] x = new()
new()
评论
var x = new();
ISomeInterface x = new()
new()