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

her*_*ert 7 dart flutter

当可以使用const构造函数时,有一个分析器/lint 检查来警告我:https : //dart-lang.github.io/linter/lints/prefer_const_constructors.html

(即使用final a = const A();代替final a = A();

我认为要了解优点(对于 const 构造函数,只会有一个具有相同常量值的实例)。但为什么这不是默认设置?由于 dart 2new可以省略,那么为什么他们不更改创建新实例的定义,该实例可以const简单地创建为const而不是new?我认为拥有一切一定有一些缺点const吗?

(例如,在一个常量上下文中,const [A()]它实际上与 相同const [const A()],那么为什么不在所有地方)?

jam*_*lin 6

那么他们为什么不改变创建可以创建新实例的定义const仅仅作为const代替new

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

  1. 有时它自动的:

    const a = A();
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 显式const表示意图。例如,假设您有:

    final a = A(B());
    
    Run Code Online (Sandbox Code Playgroud)

    whereABconst构造函数。后来有人改了:

    final a = A(C());
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. const 可能有缺点。const创建编译时常量。如果你有:

    final a1 = A();
    final a2 = A();
    
    Run Code Online (Sandbox Code Playgroud)

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

  4. 我认为编译时常量永远存在。重点是拥有一个可以重用的对象,而不是重新构建它。不利的一面是,它们真的不容易被摧毁。