Dart 中final和const的使用詳解

1.基本使用this

若是變量的值不發生變化,那麼能夠使用 final 或 const 修飾,code

----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.高級使用class

----當爲final修飾的值賦一個包含成員變量或方法的對象時:變量

     --------1.  對象成員值能被修改,對於可以添加成員的類(如List、Map)則能夠添加或刪除成員List

     --------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);
}
相關文章
相關標籤/搜索