3

假设我有一个以向量类作为输入的函数 foo:

void Foo( Vector3 vector );

如果我想调用这个函数:

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

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

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

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

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

将在堆栈上创建一个 Vector3 对象,不需要 new/calloc/malloc。

4

1 回答 1

12

语言设计者认为该关键字是合适的。在 C# 中很常见的是,该语言会强制您了解正在发生的事情,并且在许多可能为您隐式添加功能或“填充”数据的情况下提供错误或警告。

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

C++ 不需要使用 new

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

没有 new( 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# 非常明确的方法(即:这是类型构造函数还是方法?)。

于 2013-07-08T17:14:20.260 回答