为什么C#中需要“新”关键字

时间:2013-07-08 17:12:07

标签: c# keyword

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

void Foo( Vector3 vector );

如果我想调用此函数:

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

为什么新关键字必不可少(在C#中)?

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

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

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

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

1 个答案:

答案 0 :(得分:12)

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

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

  

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)。 C#没有这种差异 - 所有引用类型总是在长期存储中分配,值类型根据其上下文和用法在一个位置分配。在对象使用和分配方面,开发人员在C#中的控制级别与C ++中的控制级别不同。

在一天结束时,每种语言(具有对象概念)都有自己的语法和规则,用于对象初始化和使用。每种语言都是独一无二的,这也是为什么有这么多不同语言的原因。一般来说,大多数语言是围绕一组管理哲学和应用程序设计的,并且使用new的要求符合C#在有可能出现歧义时非常明确的方法(即:这是一个类型构造函数还是方法?)。