为什么“;新的“;C#中必需的关键字

本文关键字:关键字 新的 为什么 | 更新日期: 2023-09-27 18:21:43

假设我有一个函数foo,它将一个向量类作为输入:

void Foo( Vector3 vector );

如果我想调用这个函数:

Foo( new Vector3(1, 2, 3) );

为什么新关键字(在C#中)是必需的?

在其他语言中,例如:C++,在这种情况下不需要使用new。这似乎是多余的

编辑1:@以下是完全有效的C++

Foo ( Vector3(1, 2, 3) );

将在堆栈上创建Vector3对象,不需要新的/calloc/malloc。

为什么“;新的“;C#中必需的关键字

语言设计者认为该关键字是合适的。在C#中,这种语言迫使你意识到正在发生的事情,并在许多情况下提供错误或警告,在这些情况下,它可能会隐式地为你添加功能或"填充"数据。

C#总是要求您在使用之前初始化变量。在这种情况下,强制使用new关键字可以让(开发人员)明显地看到,一个新实例(如果Vector3是一个类)或一个完全构造的类型(如果Vector 3是一种值类型)将被传递给您的方法,而不是方法调用的结果。

C++没有必要使用新的

请注意,在C++中,new在这里不是可选的,至少在不更改函数定义的情况下是可选的。使用new将意味着Foo()将需要不同的语法。

没有新的呼叫(Foo(Vector3(1,2,3));)表明Foo被定义为void Foo(Vector3 vector)。如果使用new Vector3,那么Foo将被定义为void Foo(Vector3* vector),因为new将返回一个指向该类型的指针。

这是因为C++允许多种形式的对象分配——您可以堆栈分配(不使用new)或在堆上分配(使用new)。C#没有这个区别——所有引用类型总是在长期存储中分配,而值类型则根据其上下文和用法在某个位置分配。在对象使用和分配方面,开发人员在C#中的控制级别与C++不同。

归根结底,每种语言(有对象的概念)都有自己的语法和对象初始化和使用规则。每种语言都是独一无二的,这也是为什么有这么多不同的语言的部分原因。一般来说,大多数语言都是围绕着一套管理哲学和方法设计的,使用new的要求符合C#的方法,即在有歧义的情况下非常明确(即:这是类型构造函数还是方法?)。