Dart 中final和const的使用详解
2017-08-16 00:00
183 查看
1.基本使用
如果变量的值不发生变化,那么可以使用 final 或 const 修饰,
----final:只能被设一次值,在声明处赋值,值和普通变量的设值一样,可以是对象、字符串、数字等,用于修饰值的表达式不变的变量;
----const:只能被设一次值,在声明处赋值,且值必须为编译时常量;用于修饰常量。
----const还可以用来声明常量值:
2.高级使用
----当为final修饰的值赋一个包含成员变量或方法的对象时:
--------1. 对象成员值能被修改,对于能够添加成员的类(如List、Map)则可以添加或删除成员
--------2. 变量本身实例不能被修改
如果变量的值不发生变化,那么可以使用 final 或 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 = []; // 未处理的异常.
2.高级使用
----当为final修饰的值赋一个包含成员变量或方法的对象时:
--------1. 对象成员值能被修改,对于能够添加成员的类(如List、Map)则可以添加或删除成员
--------2. 变量本身实例不能被修改
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); }