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
相关产品推荐
相关产品推荐

