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 {
}
- 在 class 中使用
static const
变量或在 Dart
中将其声明为 const 之间是否有任何区别或含义?
- 也许编译后的代码发生了变化?
- 哪个性能更好?
- 如果变量是文件私有的,我们应该遵循哪一个?
缺点声明必须使用 const
。您必须将其声明为 static const
而不仅仅是 const
.
static
、final
和 const
在 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
.
检查这两个例子:
static const
在 class 内:
class SessionStorage {
static const String _keySessionExist = 'storage.key';
}
只是 class 之外的一个 const
:
const String _keySessionExist = 'storage.key';
class SessionStorage {
}
- 在 class 中使用
static const
变量或在Dart
中将其声明为 const 之间是否有任何区别或含义? - 也许编译后的代码发生了变化?
- 哪个性能更好?
- 如果变量是文件私有的,我们应该遵循哪一个?
缺点声明必须使用 const
。您必须将其声明为 static const
而不仅仅是 const
.
static
、final
和 const
在 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 asconst
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
.