在Dart中,const和final关键字之间有什么区别?
当前回答
final和const都防止变量被重新赋值(类似于Java中的final或JavaScript中的const)。
这种差异与内存的分配方式有关。在运行时为final变量分配内存,在编译时为const变量分配内存。最后一个修饰符应该是更常用的,因为许多程序变量不需要任何内存,因为程序逻辑不会调用它们进行初始化。对于一个const变量,你基本上是在告诉计算机,“嘿,我需要这个变量的内存,因为我知道我将会需要它。”
以这种方式思考它们可以更容易地理解它们在语法用法上的差异。主要是final变量可以是实例变量,而const必须是类上的静态变量。这是因为实例变量是在运行时创建的,而const变量(根据定义)不是。因此,类上的const变量必须是静态的,这意味着类上存在该变量的单个副本,而不管该类是否实例化。
这段视频相当简单地解释了这一点: https://www.youtube.com/watch?v=9ZZL3iyf4Vk
本文将更深入地讨论并解释两者之间非常重要的语义差异,即final修改变量而const修改值,这本质上归结为只能初始化编译时可派生的const值。
https://news.dartlang.org/2012/06/const-static-final-oh-my.html
其他回答
简单的单词:
常量
值必须在编译时已知,即来自内部文件的值。
示例:API键,应用程序支持的语言或helper文件中的任何变量,基本上是应用程序附带的任何东西。
最后
值必须在运行时已知。
它可以是上面的数据,也可以是设备信息,当应用程序启动时将被检查,或者当应用程序启动时从API或服务器加载的数据,但在应用程序准备使用之前,即你需要检查用户是否登录,你的应用程序将从服务器加载或检查会话令牌。
final和const都防止变量被重新赋值(类似于Java中的final或JavaScript中的const)。
这种差异与内存的分配方式有关。在运行时为final变量分配内存,在编译时为const变量分配内存。最后一个修饰符应该是更常用的,因为许多程序变量不需要任何内存,因为程序逻辑不会调用它们进行初始化。对于一个const变量,你基本上是在告诉计算机,“嘿,我需要这个变量的内存,因为我知道我将会需要它。”
以这种方式思考它们可以更容易地理解它们在语法用法上的差异。主要是final变量可以是实例变量,而const必须是类上的静态变量。这是因为实例变量是在运行时创建的,而const变量(根据定义)不是。因此,类上的const变量必须是静态的,这意味着类上存在该变量的单个副本,而不管该类是否实例化。
这段视频相当简单地解释了这一点: https://www.youtube.com/watch?v=9ZZL3iyf4Vk
本文将更深入地讨论并解释两者之间非常重要的语义差异,即final修改变量而const修改值,这本质上归结为只能初始化编译时可派生的const值。
https://news.dartlang.org/2012/06/const-static-final-oh-my.html
dart中的Final和const很容易混淆,以至于我们认为它们是相同的。
让我们来看看它们的区别:
附注:我包括图像而不是文本,因为我不能将信息制成表格 在Stackoverflow .md格式轻松。
const是一个编译时常量。
final是一个运行时常数。
dart的网站上有一个帖子,解释得很好。
最后:
"final"表示单赋值:final变量或字段必须有初始化式。一旦赋值,最终变量的值就不能更改。Final修改变量。
常量:
“const”在Dart中有一个更复杂和微妙的含义。Const用于修改值。你可以在创建集合时使用它,比如const[1,2,3],也可以在构造对象(而不是new)时使用它,比如const Point(2,3)。在这里,const意味着对象的整个深度状态可以完全在编译时确定,对象将被冻结并且完全不可变。
Const对象有几个有趣的属性和限制:
它们必须从可以在编译时计算的数据中创建。const对象不能访问运行时计算所需的任何内容。1 + 2是一个有效的const表达式,但new DateTime.now()不是。
它们是深刻的、传递的不可变的。如果final字段包含一个集合,则该集合仍然可以是可变的。如果你有一个const集合,它里面的所有东西也必须是const,递归地。
它们被规范化了。这有点像字符串实习:对于任何给定的const值,无论对const表达式求值多少次,都会创建一个const对象并重新使用。
那么,这意味着什么呢?
Const: If the value you have is computed at runtime (new DateTime.now(), for example), you can not use a const for it. However, if the value is known at compile time (const a = 1;), then you should use const over final. There are 2 other large differences between const and final. Firstly, if you're using const inside a class, you have to declare it as static const rather than just const. Secondly, if you have a const collection, everything inside of that is in const. If you have a final collection, everything inside of that is not final.
最后: 如果在编译时不知道Final的值,则应该在const上使用Final,并且它将在运行时计算/获取。如果你想要一个不可更改的HTTP响应,如果你想从数据库中获取一些东西,或者如果你想从本地文件中读取,请使用final。编译时不知道的任何东西都应该在const上使用final。
话虽如此,const和final都不能被重赋,但final对象中的字段,只要它们本身不是const或final,就可以被重赋(不像const)。
推荐文章
- 为什么非const引用不能绑定到临时对象?
- 在Flutter中向有状态小部件传递数据
- 不能引用在不同方法中定义的内部类中的非最终变量
- 未处理异常:ServicesBinding.defaultBinaryMessenger在绑定初始化之前被访问
- 静态const vs #define
- 常量指针和指向常量的指针
- char*和const char*的区别?
- 颤振-换行文本
- 如何在Dart中四舍五入到小数点后的给定精度程度?
- 添加一个启动屏幕颤振应用程序
- 在flutter中等同于wrap_content和match_parent ?
- 多行文本字段在扑动
- 在Dart中命名参数和位置参数之间有什么区别?
- 如何用Dart将字符串解析为数字?
- 如何在颤振的一些延迟后运行代码?