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

在Dart中是否必须使用new关键字?省略它对代码有影响吗?

省略Dart中的new关键字对代码有影响吗?

嘿,这个问题问得特别实在!其实从Dart 2.0版本开始,new关键字就已经变成可选的了——你完全可以放心省略它,不管是代码运行逻辑还是性能,都不会有任何影响。下面给你拆解几个关键点:

  • 语法与编译层面完全等价
    不管你写不写new,Dart编译器都会把这两种写法当成完全相同的代码处理。比如你写:

    final widget = new Widget();
    

    和

    final widget = Widget();
    

    编译后的结果没有任何区别,最终都会调用Widget的构造函数创建实例。

  • 官方推荐的简洁写法
    Dart团队在2.0之后就明确推荐省略new,这样代码会更清爽易读,尤其是在Flutter开发中嵌套Widget的时候,能减少大量冗余字符。比如原来的:

    new Container(
      child: new Text('Hello Dart'),
      padding: new EdgeInsets.all(8),
    )
    

    现在可以写成:

    Container(
      child: Text('Hello Dart'),
      padding: EdgeInsets.all(8),
    )
    

    是不是看起来舒服多了?

  • 几乎不存在混淆风险
    有人可能会担心:如果类里有和类名同名的静态方法,会不会调用错?其实完全不用担心——Dart会优先把Class()解析为构造函数调用,如果你要调用静态方法,必须写成Class.method()的形式(比如MyWidget.create()),所以根本不会和构造函数调用混淆。

举个实际的例子验证一下:

class User {
  User() {
    print('调用普通构造函数');
  }

  factory User.fromId(int id) {
    print('调用工厂构造函数');
    return User();
  }

  static User create() {
    print('调用静态方法');
    return User();
  }
}

void main() {
  // 两种写法都调用普通构造函数
  final u1 = new User();
  final u2 = User();

  // 两种写法都调用工厂构造函数
  final u3 = new User.fromId(1);
  final u4 = User.fromId(1);

  // 调用静态方法必须加方法名
  final u5 = User.create();
}

总的来说,省略new是现在Dart的标准写法,完全安全,还能让代码更简洁,放心用就好!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:33:25