Dart语言中 const 和 final 关键字有什么区别?
const
final
这让我很困惑 .
我在dart的网站上发现了这篇文章,它解释得非常好 .
https://news.dartlang.org/2012/06/const-static-final-oh-my.html
最后:
“final”表示单一赋值:最终变量或字段必须具有初始值 . 一旦赋值,就不能改变最终变量的值 . final修改变量 .
常数:
“const”的含义在Dart中有点复杂和微妙 . const修改值 . 您可以在创建集合时使用它,例如const [1,2,3],以及构造对象(而不是new)时的const Point(2,3) . 这里,const意味着对象的整个深度状态可以在编译时完全确定,并且对象将被冻结并完全不可变 . Const对象有一些有趣的属性和限制:它们必须从可以在编译时计算的数据创建 . const对象无法访问运行时需要计算的任何内容 . 1 2是一个有效的const表达式,但新的DateTime.now()不是 . 它们是深刻的,过渡性的一成不变的 . 如果您有包含集合的final字段,则该集合仍然可以变为可变 . 如果你有一个const集合,那么它中的所有东西也必须是递归的const . 它们是规范化的 . 这有点像字符串实习:对于任何给定的const值,无论const表达式被计算多少次,都将创建并重用单个const对象 .
通过@Meyi扩展答案
最终变量只能设置一次并在访问时初始化 . (例如,如果使用 biggestNumberOndice 的值,则从下面的代码部分开始,然后将初始化该值并分配内存) .
biggestNumberOndice
const本质上是内部最终的,但主要区别在于它的编译时间常量在编译期间初始化,即使你不使用它的值它也会被初始化并占用内存空间 .
类中的变量可以是final但不是常量,如果你想在类级别使用常量,则使其成为静态const .
Code:
void main() { // final demonstration final biggestNumberOndice = '6'; // biggestNumberOndice = '8'; // Throws an error for reinitialization // const const smallestNumberOnDice = 1; } class TestClass { final biggestNumberOndice = '6'; //const smallestNumberOnDice = 1; //Throws an error //Error . only static fields can be declared as constants. static const smallestNumberOnDice = 1; }
如果你来自 C++ ,那么 Dart 中的 const 在 C++ 中是 constexpr 而 Dart 中的 final 在 C++ 中是 const .
C++
Dart
constexpr
以上仅适用于原始类型 . 但是在 Dart 中,标记为 final 的对象在其成员方面是可变的 .
3 回答
我在dart的网站上发现了这篇文章,它解释得非常好 .
https://news.dartlang.org/2012/06/const-static-final-oh-my.html
最后:
常数:
通过@Meyi扩展答案
最终变量只能设置一次并在访问时初始化 . (例如,如果使用
biggestNumberOndice
的值,则从下面的代码部分开始,然后将初始化该值并分配内存) .const本质上是内部最终的,但主要区别在于它的编译时间常量在编译期间初始化,即使你不使用它的值它也会被初始化并占用内存空间 .
类中的变量可以是final但不是常量,如果你想在类级别使用常量,则使其成为静态const .
Code:
如果你来自
C++
,那么Dart
中的const
在C++
中是constexpr
而Dart
中的final
在C++
中是const
.以上仅适用于原始类型 . 但是在
Dart
中,标记为final
的对象在其成员方面是可变的 .