【问题标题】:Difference between static and const variable in DartDart中静态变量和常量变量的区别
【发布时间】:2021-04-20 12:21:22
【问题描述】:

检查这两个例子:

static const 类内:

class SessionStorage {
  static const String _keySessionExist = 'storage.key';
}

在课堂外只是一个const

const String _keySessionExist = 'storage.key';

class SessionStorage {

}
  • 在类内部使用 static const 变量或在 Dart 中将其声明为外部的 const 是否有任何区别或影响?
  • 可能编译后的代码发生了变化?
  • 哪个性能更好?
  • 如果变量是文件私有的,我们应该遵循哪一个?

【问题讨论】:

    标签: flutter dart compilation constants


    【解决方案1】:
    • 在类中使用 static const 变量或在 Dart 中将其声明为 const 之间有什么区别或影响吗?

    明显的区别是static 版本必须用类名来引用。除了名称解析的变化,应该是一样的。

    • 可能编译后的代码发生了变化?
    • 哪个性能更好?

    它们都是编译时常量。应该没什么区别。

    • 如果变量是文件私有的,我们应该遵循哪一个?

    如果你想要一个 Dart 库私有的东西(通常是指文件),那么在它前面加上 _。不管是全局还是static

    【讨论】:

    • 你说“不应该有任何区别”。但我怎么能确定呢?我来自java,编译后的文件仍然可读,所以我可以看到我的代码在编译的工件中是如何变化的,有没有办法在dart中做到这一点?
    【解决方案2】:

    cons 的声明必须使用const,你必须将它声明为static const 而不仅仅是const。

    staticfinalconst 在 Dart 中表示完全不同的东西:

    static 表示成员在类本身而不是类的实例上可用。这就是它的全部含义,它不用于其他任何事情。 static 修改成员

    final 表示单一赋值:最终变量或字段必须有一个初始化器。一旦分配了一个值,最终变量的值就不能更改。 final 修改变量

    const 在 Dart 中具有更复杂和微妙的含义。 const 修改。您可以在创建集合时使用它,例如 const [1, 2, 3],以及在构造对象(而不是 new)时,例如 const Point(2, 3)。这里,const 意味着对象的整个深度状态可以完全在编译时确定,并且对象将被冻结并且完全不可变。

    Const 对象有几个有趣的属性和限制: 它们必须由可在编译时计算的数据创建。 const 对象无权访问您在运行时需要计算的任何内容。 1 + 2 是有效的 const 表达式,但 new DateTime.now() 不是。 它们是深刻的、传递性的不可变的。如果您有一个包含集合的最终字段,则该集合仍然可以是可变的。如果您有一个 const 集合,则其中的所有内容也必须是 const 递归的。 它们是规范化的。这有点像字符串实习:对于任何给定的 const 值,无论对 const 表达式求值多少次,都将创建并重复使用单个 const 对象。换句话说:

    getConst() => const [1, 2]; 
    
        main() { 
          var a = getConst(); 
          var b = getConst(); 
          print(a === b); // true 
        } 
    

    我认为 Dart 在保持语义和关键字清晰明确方面做得很好。 (曾经有一段时间 const 用于 const 和 final。这很令人困惑。)唯一的缺点是,当你想指示一个成员是单赋值的并且在类本身上时,你必须同时使用这两个关键字:静态最终。

    还有:

    我建议你看看这个问题

    What is the difference between the "const" and "final" keywords in Dart?

    【讨论】:

      猜你喜欢
      • 2011-01-14
      • 2015-08-11
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2016-07-26
      • 2012-05-14
      相关资源
      最近更新 更多