检查这两个示例:static const
在类内部:
class SessionStorage {
static const String _keySessionExist = 'storage.key';
}
只有类外的const
:
const String _keySessionExist = 'storage.key';
class SessionStorage {
}
- 在
Dart
中,在类内部有一个static const
变量,或者只是在类外部将它声明为const,这两者之间有什么区别或影响吗? - 编译后的代码可能会发生变化?
- 哪一个性能更好?
- 如果变量是文件的私有变量,我们应该遵循哪一个?
3条答案
按热度按时间62o28rlo1#
cons的声明必须使用
const
。您必须将其声明为static const
,而不仅仅是const
。static
、final
和const
在Dart中的含义完全不同:static
意味着成员在类本身而不是类的示例上可用。这就是它的全部含义,它不用于其他任何东西。static修改 * 成员 *。final
表示单分配:一个final变量或字段 * 必须 * 有一个初始化器。一旦赋值,最终变量的值就不能更改。final修改 variables。const
在Dart中有一个更复杂和微妙的含义。const修改 values。你可以在创建集合时使用它,比如const [1,2,3],也可以在构造对象(而不是new)时使用它,比如const Point(2,3)。在这里,const意味着对象的整个深度状态可以在编译时完全确定,并且对象将被冻结并且完全不可变。Const对象有几个有趣的属性和限制:它们必须从可以在编译时计算的数据创建。const对象不能访问运行时需要计算的任何内容。1 + 2是一个有效的常量表达式,但new DateTime.now()不是。它们是深度传递不可变的。如果您有一个包含集合的final字段,则该集合仍然可以是可变的。如果你有一个const集合,它里面的所有东西也必须是const,递归的。他们是“标准化”的。这有点像字符串实习:对于任何给定的const值,无论const表达式被求值多少次,都将创建并重用单个const对象。换句话说:
我认为Dart在保持语义和关键字清晰和独特方面做得很好。(有一段时间,const同时用于const和final。唯一的缺点是,当你想指示一个成员是单赋值的并且在类本身上时,你必须使用两个关键字:static final
另外:
我建议你看看这个问题
What is the difference between the "const" and "final" keywords in Dart?
x6492ojm2#
static const
变量,或者只是在类外部声明为const
,这两者之间有什么区别或影响吗?明显的区别是
static
版本必须用类名引用。除了名称解析中的更改外,应相同。它们都是编译时常量。应该没什么区别。
如果你想要一些Dart库的私有内容(通常指文件),那么用
_
作为前缀。不管它是全局的还是static
。zujrkrfu3#
如果同时有多个带有静态字段的Class示例,则该字段的值将仅在内存中存储一次。如果您不能定义
static const
,但可以定义static final
字段,则会很有帮助。