天天看點

Dart 基礎類型 var、dynamic、object、finaldart的前世今生類型安全vardynamic Objectfinal總結

dart的前世今生

在開始之前,建議閱讀這篇文章,介紹了dart語言的背景、想要解決的問題等等【科普】Dart語言

類型安全

首先要明确一點,dart是強類型語言或者叫類型安全,何為強類型,簡單來說就是變量一但确認它的類型,除非明确進行類型轉換,否則不可以被當做其他類型使用,這點和JS等弱類型語言是有差別的。

如果對強弱類型感興趣,可以參考:什麼是強類型語言,什麼是弱類型語言,為什麼python也是強類型語言。

dart為什麼要使用強類型,在其官網中也有介紹Dart 語言裡的類型體系

在編譯時就可以檢查并顯示類型相關的錯誤。

安全的類型系統強制要求代碼明确類型,是以在編譯時會顯示與類型相關的錯誤,這些錯誤可能在運作時可能很難發現。

代碼更容易閱讀。 代碼更容易閱讀,因為我們信賴一個擁有指定類型的值。在類型安全的 Dart 中,類型是不會騙人的。因為一個擁有指定類型的值是可以被信賴的。
代碼可維護性更高。 在安全的類型系統下,當更改一處代碼後,類型系統會警告是以影響到的其他代碼塊。
更好的 AOT 編譯。 雖然在沒有類型的情況下可以進行 AOT 編譯,但生成的代碼效率要低很多。

var

雖然dart是強類型語言,但是它仍然保留了一個var、dynamic等關鍵詞來提供類型轉換,var會自動識别定義變量的類型,比如定義一個string

String s = 'this is a string';
//or
var s;
s = 'string'; //這時,s的最終類型就被确定
           

使用var來定義,如有初始值,則該變量類型即确定,無法就不能更改,如果初始值沒有定義,則該變量還可以更改類型,示例如下:

var s = 'this is a string'; // s is String
s = 1;// error

var s ;  //dynamic
s = 'string';
s = 1; //correct
           

再第二個例子中,s因為沒有初始化,則其其實為dynamic類型,可以更改類型

dynamic Object

dynamic和Object的用法如上述所示,可以動态更改類型,如

dynamic a = '5';
a = 5; //correct

Object b = '5';
b = 5; //correct
           

不同之處

那兩者的不同之處是什麼呢,Stack Overflow有個回答直接搬過來what-is-the-difference-between-dynamic-and-object-in-dart

簡單來說,就是dynamic擁有任何可能類型的方法和屬性,而object不能,比如:

dynamic a;
Object b;

main() {
  a = "";
  b = "";
  printLengths();
}

printLengths() {
  // no warning
  print(a.length);

  // warning:
  // The getter 'length' is not defined for the class 'Object'
  print(b.length);
}
           

final

fianl用來定義常量,同樣用于定義常量的還有const,兩者的差別在于:

  1. const 是編譯常量,編譯的時候就要确定常量值,而final是運作時常量,隻需要運作的時候确定常量時即可,而且final
  2. final 可以惰性初始化

先看例子:

const a; //error 這裡一定要指定值
final a; 
a = 5; //correct

const a =  DateTime.now(); //error
final b = DateTime.now();

           

這裡的const在定義的時候,一定要是有明确的值,且在編譯的時候就要确定,而final不需要,可以動态指定,延後指定

總結

看了上述的解釋,用來的時候有什麼建議呢?

  1. final用來處理隻需要初始化一次的值,比如一些類的初始參數等
  2. 普通的參數盡可能用var,且最好初始化,這樣可以先發享受類型安全的好處,盡可能發揮dart的性能
  3. 其他情況就自由發揮了