首页 > 解决方案 > Dart 中静态变量和 const 变量的区别

问题描述

检查这两个示例:

static const课堂内:

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

只是const课外:

const String _keySessionExist = 'storage.key';

class SessionStorage {

}

标签: flutterdartcompilationconstants

解决方案


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

static, final, 和const在 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。这很令人困惑。)唯一的缺点是,当你想指示一个成员是单赋值的并且在类本身上时,你必须同时使用这两个关键字:静态决赛。

还:

我建议你看看这个问题

Dart 中的“const”和“final”关键字有什么区别?


推荐阅读