2.認識Dart中的物件和變數

CoorChice發表於2019-03-19

目錄傳送門:《Flutter快速上手指南》先導篇

萬物皆物件

在 Dart 中,萬物皆物件,包括函式。

所有的物件都繼承自 Object 類。

並且,所有物件的預設值都是 null

void main() {
  var test_var;
  print("value = $test_var");
}


>>>
value = null
複製程式碼

如何宣告變數

  1. 使用 var 關鍵字

    var name = 'Bob';
    複製程式碼

    使用 var 可以宣告一個不定型別的變數,但當該變數被第一次賦值時,該變數型別就被確定。

    從此,你不能再改變該變數的型別,任何錯誤的嘗試,你都會得到編譯器的報錯。

    eg:

    name = 1;
    
    
    >>>
    A value of type 'int' can't be assigned to a variable of type 'String'.
    複製程式碼
  2. 使用 dynamicObject

    這兩個傢伙具有同樣的效果!

    它們都可以達到宣告一個可變型別的變數的效果,即你可以隨時使用該變數來指向任何一種型別的物件。

    當然,編譯器是不會告訴你你犯了任何的錯誤,它只會讓你的程式碼被順利的編譯 ?

    確切來說,dynamic 實際上是一個關鍵字,而 Object 之所以有同樣的效果,完全是因為任何物件型別,都源自於它。

    所以你看,它兩具有同樣的效果,但具有不同的原理。

    eg:

    void main() {
      dynamic name = "Bob";
      print("value = $name");
      name = 1;
      print("value = $name");
    }
    
    
    >>>
    value = Bob
    value = 1
    複製程式碼

    換成 Object 也會得到同樣的結果。

  3. 使用具體物件宣告

    String name = 'Bob';
    複製程式碼

    對此,我想我不用有太多的解釋。

  4. 使用 finalconst

    如果你希望一個物件被初始化後,不能再被修改,那麼你應該使用這兩個關鍵字。

    final name = 'Bob';
    final String nickname = 'Bobby';
    
    const bar = 1000000;
    const double atm = 1.01325 * bar;
    複製程式碼

    到現在為止,它兩看起來沒什麼差別。

    const 厲害的地方在於,它是編譯時常量的關鍵字,你在編譯期就需要確定它的初始值。

    而 final 只會在執行時才要求確定初始值。

    const 除了可以宣告一個不可變的常量外,還可以用來建立常量陣列。

    void main() {
      var userInfo = const [];
      final githuber = const ['CoorChice'];
      const nums = [1, 2, 3];
    
      userInfo = ['bob', 2];
      print(userInfo);
    }
    
    
    >>>
    [bob, 2]
    複製程式碼

    第一項之所能夠被改變,是因為我們定一個是個 const [] 常量陣列。

    而剩餘兩項初始化後不能被改變物件的值,finalconst 都是被作為常量關鍵字被使用的,而被它們修飾的變數,不能再修改其值。

擴充套件

  • ??= 操作符

    考慮以下例子:

    b ??= value;
    複製程式碼

    如果 b 為 null,就會把 value 賦值給 b。

    如果 b 不為 null,則仍然保持原值。

目錄傳送門:《Flutter快速上手指南》先導篇

如何找到我?

傳送門:CoorChice 的主頁

傳送門:CoorChice 的 Github


相關文章