【问题标题】:Dart: Is there a disadvantage to using const constructor?Dart:使用 const 构造函数有缺点吗?
【发布时间】:2019-12-27 16:25:07
【问题描述】:

当可以使用 const 构造函数时,有一个分析器/lint 检查来警告我: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()] 相同,那么为什么不是到处)?

【问题讨论】:

  • @CopsOnRoad 也许我是盲人,但我仍然找不到在链接的问题/答案或链接的博客文章中使用const(如果可能)的任何缺点?跨度>
  • 使用const 的缺点之一是您必须将所有实例变量设为final
  • @CopsOnRoad 这不是使用const 实例的缺点,只是const 构造函数的要求。当我使用具有const 构造函数的类(例如flutter 的SizedBox)时,为什么我会想要SizedBox(height: 8)(使用new)而不是const
  • 阅读一下this

标签: flutter dart


【解决方案1】:

那么他们为什么不改变创建一个新实例的定义,该实例可以创建为const 简单地为const 而不是new

如果你的意思是为什么final a = A(); 不自动假设const A() 如果A 有一个const 构造函数:

  1. 有时它自动的:

    const a = A();
    

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

  2. 明确的const 表达意图。例如,假设您有:

    final a = A(B());
    

    其中ABconst 构造函数。后来,有人做出改变:

    final a = A(C());
    

    C 在哪里 没有const 构造函数。如果const 是自动的,那么您将不知道a 不再是const。也许这没关系,但它也可能突然对应用程序的性能产生负面影响,并且如果没有明确的 const 限定符,本地更改的影响可能比预期的范围更广。 (也就是说,显式 const 限定符和自动添加它们并不相互排斥。)

  3. const 可能有缺点。 const 创建 compile-time 常量。如果你有:

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

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

  4. 我认为编译时常量永远存在。关键是要有一个可以重用的对象,而不是重新构造它。不利的一面是它们不能轻易被摧毁。

【讨论】:

  • 谢谢,我认为尤其是 3&4 非常有意义。如果const 对象永远不会被破坏,那么在使用Expando 时记住这一点可能很重要。从未建立过这种联系,即使它在那里有记录。
猜你喜欢
  • 2014-11-03
  • 1970-01-01
  • 2011-02-27
  • 2023-03-19
  • 2022-01-09
  • 2020-08-26
  • 1970-01-01
  • 2011-08-07
  • 2018-12-03
相关资源
最近更新 更多