Dart 中 final 和 const 区别
时间:2022-07-24
本文章向大家介绍Dart 中 final 和 const 区别,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
用final
修饰的变量,必须在定义时将其初始化,其值在初始化后不可改变;
const
用来定义常量。
它们的区别在于,const
比final
更加严格。final
只是要求变量在初始化后值不变,但通过final
,我们无法在编译时(运行之前)知道这个变量的值;而const
所修饰的是编译时常量,我们在编译时就已经知道了它的值,显然,它的值也是不可改变的。
下面先用简单的例子说明一下区别,再通过代码理解"const
所修饰的是编译时常量"这句话:
基本用法
final:只能被设一次值,在声明处赋值,值和普通变量的设值一样,可以是对象、字符串、数字等,用于修饰值的表达式不变的变量;
final name = 'Bob';
// name = 'job'; //运行出错,因为final修饰的变量不能调用其setter方法,即:不能设值
const:只能被设一次值,在声明处赋值,且值必须为编译时常量;用于修饰常量。
const bar = 1000000; // 定义常量值
// bar =13; // 出现异常,const修饰的变量不能调用setter方法,即:不能设值,只能在声明处设值
const atm = 1.01325 * bar; // 值的表达式中的变量必须是编译时常量(bar);
var c = 12;
// atm = 1 * c; //出错,因为c不是一个编译时常量,即:非const修饰的变量(只有const修饰的变量才是编译时常量)
const还可以用来声明常量值:
// [] 创建一个空列表.
// const [] 创建一个空的不可变列表 (EIA).
var foo = const []; // foo 目前是一个 EIA.
final bar = const []; // bar 永远是一个 EIA.
const baz = const []; // baz 是一个编译时常量 EIA.
//你可以改变 非final, 非const 修饰的变量,
// 即使它的值为编译时常量值.
foo = [];
// 不能改变final和const修饰的变量的值.
// bar = []; // 未处理的异常.
// baz = []; // 未处理的异常.
高级使用
当为final修饰的值赋一个包含成员变量或方法的对象时:
- 对象成员值能被修改,对于能够添加成员的类(如List、Map)则可以添加或删除成员
- 变量本身实例不能被修改
class Point{
var x,y;
Point(this.x,this.y){
}
}
main() {
final p = new Point(1,2);
// p = new Point(3,4); //出错,final修饰的变量不能调用setter方法;
p.x=2; // 正常执行,修改的是变量的属性值,而不是变量引用的对象;
print(''p.x); // 打印 2
var foo = const [];
foo = [1,2,1];
/*此部分代码的重点在于var foo , 一个正常变量可以随意赋值或更改,重点不在const [],
所以不要纠结const []是不可变的。[]和[1,2,1]是不同的对象*/
print(foo);
final baz = [1];
// baz=[1,2,3,4]; //出错 此调用修改了变量的实例 即:[1] 和[1,2,3,4]是不同的对象
baz[0]=2; //正常执行,只修改了变量引用对象的成员变量的值
print(baz);
final bad = []; //List<int>
bad.add(1); //正常执行,向变量引用对象添加成员
bad.add(2);
print(bad)
final Map<String, String> cache = <String, String>{}; //Map
cache['name1']='1213';
cache['name2']='1313';
print(cache);
}
参考文档
- http://www.voidcn.com/article/p-eqqxibed-bqr.html
- https://my.oschina.net/jthmath/blog/419232
- http://dart.goodev.org/guides/language/language-tour
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Jenkins参数化构建与触发
- 数据无法模拟,自动化受阻怎么办?
- Quickprop介绍:一个加速梯度下降的学习方法
- PandaSQL:一个让你能够通过SQL语句进行pandas的操作的python包
- 每个数据科学家都应该知道的20个NumPy操作
- 机器学习特性缩放的介绍,什么时候为什么使用
- 聊聊claudb的set command
- 聊聊claudb的zset command
- 聊聊claudb的pubsub command
- 聊聊claudb的transaction command
- 聊聊claudb的scripting command
- 聊聊claudb的hash command
- 聊聊claudb的string command
- 为什么你使用的 Spring Security OAuth 过期了?松哥来和大家捋一捋!
- 一个诡异的登录问题