Dart:使用 const 构造函数有缺点吗?

2023-12-23

当可以使用分析器/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构造函数:

  1. 有时它is自动的:

    const a = A();
    

    在这种情况下A的构造函数正在 a 中被调用const上下文,不需要额外的const右侧的限定符。

  2. 明确的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限定符和自动添加它们并不相互排斥。)

  3. const can有缺点。const创造编译时常数。如果你有:

    final a1 = A();
    final a2 = A();
    

    identical(a1, a2)不是真的。如果const A()是隐式的,那么identical(a1, a2) would是的,也许这不是代码想要拥有的属性。

  4. 编译时常量永远存在。重点是拥有一个可以重用的对象,而不是重新构建它。另一方面是不会被破坏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dart:使用 const 构造函数有缺点吗? 的相关文章