You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中new关键字与直接调用构造函数的区别及new是否可选

在Dart中使用new关键字 vs 直接调用构造函数的区别

嘿,这个问题问得特别到位!我来给你把Dart里new关键字的用法和差异掰扯清楚~

核心结论:Dart 2.0+中new是可选的,两种写法完全等价

从Dart 2.0版本开始,new关键字就变成了可选语法——也就是说,MyClassName(a,b)和new MyClassName(a,b)这两种写法没有任何功能上的区别,返回的都是该类的全新实例,底层编译后的代码也完全一致。

不管你是直接赋值给变量,还是像你提到的作为函数参数(argument: MyClassName(a,b) vs argument: new MyClassName(a,b)),最终的运行结果、实例的类型和行为都不会有任何差异。

为什么会有两种写法?

这得从Dart的版本演变说起:

  • 在Dart 1.x时代,new是必须的关键字,用来明确区分“创建类的实例”和调用普通函数的行为。
  • 到了Dart 2.0,官方为了简化语法、让代码更简洁,把new变成了可选。编译器会自动识别构造函数调用的场景,不需要再显式写new。

要不要保留new?完全是风格选择

虽然两种写法功能一致,但有些开发者还是会选择保留new,原因大多是:

  • 让代码意图更明确:一眼就能看出这是在创建新实例,而不是调用普通函数。
  • 项目历史习惯:如果是从Dart 1.x迁移过来的老项目,团队可能会保留原有写法保持一致性。

不过这完全是个人或团队的风格偏好,不会影响代码的运行效果。

举个直观的例子验证

class MyClass {
  final int a;
  final int b;
  
  MyClass(this.a, this.b);
}

void main() {
  var instance1 = MyClass(10, 20);
  var instance2 = new MyClass(10, 20);
  
  print(instance1.runtimeType); // 输出 MyClass
  print(instance2.runtimeType); // 输出 MyClass
  print(instance1 is MyClass); // 输出 true
  print(instance2 is MyClass); // 输出 true
  print(instance1 == instance2); // 输出 false(因为是两个不同的实例,但类型完全相同)
}

内容的提问来源于stack exchange,提问作者Arnav Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:22:48