Dart 中的 const 關(guān)鍵字

const 修飾內(nèi)置數(shù)據(jù)類型

const 修飾內(nèi)置數(shù)據(jù)類型,那么之后就不允許修改了,否則編譯階段會報錯。

void main() {
  const int a = 1;
  // a = 2;
  const double d = 1.0;
  // d = 2.0;
  const String str = "hello";
  // str = "world";
  const List list = [1, 2, 3];
  // list = [4, 5, 6];
}

const 修飾自定義數(shù)據(jù)類型

如果要用 const 修飾自定義數(shù)據(jù)類型,那么它的構(gòu)造方法也必須加 const,否則編譯階段會報錯。

void main() {
  // 此處編譯報錯:Const variables must be initialized with a constant value.
  const Person p = Person("Jack", 11);
}

class Person {

  String name;
  int age;

  Person(this.name, this.age);
}

構(gòu)造方法加上 const 之后,編譯器提示成員變量必須是 final 的。

void main() {
  const Person p = Person("Jack", 11);
}

class Person {

  String name;
  int age;

  // 此處編譯報錯:Can't define a const constructor for a class with non-final fields.
  const Person(this.name, this.age);
}

繼續(xù)給成員變量加 final 關(guān)鍵字,發(fā)現(xiàn)沒有編譯錯誤了。

void main() {
  const Person p = Person("Jack", 11);
  // p = Person("Rose", 12) // 不可以修改
}

class Person {

  final String name;
  final int age;

  const Person(this.name, this.age);
}

注意:const 要加到前面才可以將變量的值設(shè)置為不可以被修改,如果 const 加到后面,變量的值還是可以被修改的。(那么,const 加到后面有什么意義呢?可以節(jié)省內(nèi)存空間,下文有具體介紹,這里就不解釋了)

void main() {
  const Person p = Person("Jack", 11);
  // p = Person("Rose", 12) // 不可以修改

  Person p2 = const Person("Jack", 11);
  p2 = const Person("Rose", 12); // 仍然可以修改
}

class Person {

  final String name;
  final int age;

  const Person(this.name, this.age);
}

類中定義 const 的成員

類中定義 const 的成員,必須要加 static 關(guān)鍵字,這是固定的定義常量的寫法。

class Person {

  // static const 定義常量
  static const String TAG = "MyTag";

  final String name;
  final int age;

  const Person(this.name, this.age);
}

const 節(jié)省內(nèi)存空間

來看看下面這個例子:

void main() {
  for (var i = 0; i < 10; i++) {
    Person p = const Person("Jack", 11);
    print(p.hashCode);
  }
}

class Person {

  static const String TAG = "MyTag";

  final String name;
  final int age;

  const Person(this.name, this.age);
}

for 循環(huán)中創(chuàng)建了 10 個 Person 對象,打印出來的 hash code 卻是一模一樣,這就說明了 10 次用的同一個對象,這樣的好處就是節(jié)省內(nèi)存空間。

這個在 flutter 中也很常用,對于一些不需要修改的控件,定義成 const,不管調(diào)用多少次,都是同一份內(nèi)存空間:

const Text("Hello World!")

const 是編譯期常量

const 是編譯器常量,不能在其中使用只能在運行期間才能確定的變量。以下代碼編譯出錯:

int count = 0;
const Text("次數(shù):$count");

const 層級

如果上層是 const 的,下面的層級必須都是 const 的

  const Padding(
    padding: const EdgeInsets.all(10),
    child: const Text("Hello World"),
  );

子層級的 const 可以省略

  const Padding(
    padding: EdgeInsets.all(10),
    child: Text("Hello World"),
  );

如果外層加了 const,但是子層級中有不能修飾為 const 的控件,編譯會報錯

const 和 final 的區(qū)別

final 修飾的變量在第一次使用時被初始化,之后不允許修改。
const 修飾的變量是一個編譯時常量,編譯后會發(fā)現(xiàn)在用到常量的地方,直接用常量值替換了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容