您是否需要在Dart中使用“ new”关键字?


94

在基于Dart的应用程序中,我刚刚注意到可以省略new关键字,并且一切正常。

代替final widget = new Widget();我也可以使用final widget = Widget();

这对代码有影响吗?

Answers:


119

不,不是的。使用Dart 2(单击以获取更多信息的公告)newandconst关键字也变为可选

这意味着该new Widget()操作与单独执行的操作完全相同Widget()


const关键字可以,但是,更改将不会是一个值const隐含的const
因此,您将必须明确指定const何时需要。


6
Dart团队暂时不得不撤退,在某些情况下仍需要newconst仍然需要(我不记得示例或规则)。在Dart 2之后,他们可能会再次尝试使其在所有地方都是可选的。
君特Zöchbauer

1
没有new需要的地方。如果省略new正确的程序,它将始终以相同的方式工作。如果您const从一个正在运行的程序中删除,则在大多数情况下,您必须编写const程序才能使其有效,该程序仍然有效。只要const表达式周围已经存在,就可以省略嵌套的const。
lrn

20

在Dart 2中,如果您调用的是类似函数的构造函数,而前面没有newconst,则相当于使用new。如果要进行const调用,则应放在const最前面。

const表达式内部,您无需const再次编写,并且在某些需要const表达式的环境中(例如,转换案例表达式和const变量的初始化程序),您甚至不需要外部const。

因此,您根本不需要写new

Dart语言团队希望允许您可以在其中插入newconst且仍然使调用正确的表达式(即具有常量参数的const构造函数)默认为插入const而不是new,希望可以在Dart 2的早期更新中使用。 ,建议new您在Object()需要将对象作为新实例的任何其他const构造函数的前面编写它。这是一种非常罕见的情况,通常您不关心不可变对象的身份(这就是为什么将插入视为好主意的原因)。const



5

new关键字在现在达特2.成为可选,调用类将始终返回这个类的一个新实例。根据我的建议,您可以在Layout定义之外使用它(NOT MANDATORY),但是在Layouts内部可以省略。

我想与大家分享的另一点是,如果您在声明小部件时使用newconst关键字,则还可以看到+图标,可用于折叠和展开小部件主体代码。当您要折叠/隐藏dart文件中的其余窗口小部件代码而在同一文件中处理其他窗口小部件代码时,此功能很有用。


关于那场崩溃的事情的好消息
MoGa

2
崩溃行为是特定于IDE的。您应该明确说明它适用于哪一个。
jamesdlin

1
另外,“调用类”(我假设您的意思是“调用类的构造函数”)并不总是返回该类的新实例。如果调用工厂构造函数,则可能会找回现有实例。这就是为什么new不鼓励这样做的原因:使用它看起来像是无条件地创建了一个新实例,而实际上并没有。
jamesdlin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.