当可以使用分析器/lint 检查时会警告我const
构造函数:https://dart-lang.github.io/linter/lints/prefer_const_constructors.html https://dart-lang.github.io/linter/lints/prefer_const_constructors.html
(即使用final a = const A();
代替final a = A();
)
我认为要理解其优点(对于 const 构造函数来说,永远只有一个具有相同常量值的实例)。但为什么这不是默认值呢?从 dart 2 开始new
可以省略,那么为什么他们不改变创建一个可以创建的新实例的定义const
简单地作为const
代替new
?我认为拥有一切一定有一些缺点const
?
(例如在恒定的上下文中,例如const [A()]
它实际上是一样的const [const A()]
,那么为什么不是到处都是)?
那么他们为什么不改变创建一个可以创建的新实例的定义const
简单地作为const
代替new
?
如果你的意思是为什么不final a = A();
自动假设const A()
if A
has a const
构造函数:
-
有时它is自动的:
const a = A();
在这种情况下A
的构造函数正在 a 中被调用const
上下文,不需要额外的const
右侧的限定符。
-
明确的const
表达intent。例如,假设您有:
final a = A(B());
where A
and B
have const
构造函数。后来有人做了修改:
final a = A(C());
where C
does not have a const
构造函数。如果const
是自动的,那么你就不会知道a
不再是const
。也许没关系,但它也可能突然对应用程序的性能产生负面影响,并且没有明确的说明const
限定词,局部变化的影响范围可能比预期的要广泛得多。 (也就是说,explicit const
限定符和自动添加它们并不相互排斥。)
-
const
can有缺点。const
创造编译时常数。如果你有:
final a1 = A();
final a2 = A();
identical(a1, a2)
不是真的。如果const A()
是隐式的,那么identical(a1, a2)
would是的,也许这不是代码想要拥有的属性。
-
编译时常量永远存在。重点是拥有一个可以重用的对象,而不是重新构建它。另一方面是不会被破坏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)