Dart中static和const变量的区别

Difference between static and const variable in Dart

检查这两个例子:

static const 在 class 内:

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

只是 class 之外的一个 const:

const String _keySessionExist = 'storage.key';

class SessionStorage {

}

缺点声明必须使用 const。您必须将其声明为 static const 而不仅仅是 const.

staticfinalconst 在 Dart 中的意思完全不同:

static 表示成员在 class 本身而不是 class 的实例上可用。这就是它的全部含义,它没有用于任何其他用途。 static 修改 members.

final 表示单一赋值:final 变量或字段 必须 具有初始值设定项。一旦分配了一个值,final 变量的值就不能改变。 final 修改 variables.

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

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

getConst() => const [1, 2]; 

    main() { 
      var a = getConst(); 
      var b = getConst(); 
      print(a === b); // true 
    } 

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

还有:

我建议你看看这个问题

  • Is there any difference or implications between having a static const variable inside of a class or just having it declared as const outside of it in Dart?

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

  • Maybe the compiled code changes?
  • Which one is more performant?

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

  • Which one should we follow if the variable is private to the file?

如果您想要 Dart 库私有的东西(通常是文件),请在其前面加上 _。不管是全局的还是static.