在Dart中,const和final关键字之间有什么区别?
当前回答
所有这些答案我都可以用简洁的方式描述。
const list = [1, 2, 3];
变量/标识符和值都是const。Like - const list = const [1,2,3] 这就是为什么他们不允许被重新分配。 很适合全局变量。 可以将其用作类变量,但必须设置为静态。Like - static const list =[1,2,3]。
vs:
final list = [1, 2, 3];
变量/标识符是const,而值不是。Like - const list = [1,2,3] 这就是为什么我们可以执行like - list.add(4)
其他回答
简单的单词:
常量
值必须在编译时已知,即来自内部文件的值。
示例:API键,应用程序支持的语言或helper文件中的任何变量,基本上是应用程序附带的任何东西。
最后
值必须在运行时已知。
它可以是上面的数据,也可以是设备信息,当应用程序启动时将被检查,或者当应用程序启动时从API或服务器加载的数据,但在应用程序准备使用之前,即你需要检查用户是否登录,你的应用程序将从服务器加载或检查会话令牌。
如果你来自c++,那么Dart中的const在c++中是constexpr,而Dart中的final在c++中是const。
以上内容仅适用于基本类型。 然而在Dart中,标记为final的对象在其成员方面是可变的。
编译时不知道的任何东西都应该在const上使用final。
具有final关键字的变量将在运行时初始化,并且只能分配一次。
带有const关键字的变量在编译时初始化,在运行时已经赋值。
使用final:如果你不知道它在编译时的值是多少。例如,当您需要从API获取数据时,就会在运行代码时发生这种情况。 使用const:如果您确定在运行代码时不会更改某个值。例如,当你声明一个始终保持不变的句子。
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
推荐文章
- 如何选择多行填充常量?
- Flutter and google_sign_in plugin: PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10:, null)
- 如何在扑动中格式化日期时间
- Ruby on Rails:哪里定义全局常量?
- 在Flutter中Column的子元素之间的空间
- 在c++中,是通过值传递更好,还是通过引用到const传递更好?
- Visual Studio代码- URI的目标不存在" package:flutter/material.dart "
- 声明一个常量数组
- 如何检查Flutter应用程序是否正在调试中运行?
- 为什么非const引用不能绑定到临时对象?
- 在Flutter中向有状态小部件传递数据
- 不能引用在不同方法中定义的内部类中的非最终变量
- 未处理异常:ServicesBinding.defaultBinaryMessenger在绑定初始化之前被访问
- 静态const vs #define
- 常量指针和指向常量的指针