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,兩者的差別在于:
- const 是編譯常量,編譯的時候就要确定常量值,而final是運作時常量,隻需要運作的時候确定常量時即可,而且final
- final 可以惰性初始化
先看例子:
const a; //error 這裡一定要指定值
final a;
a = 5; //correct
const a = DateTime.now(); //error
final b = DateTime.now();
這裡的const在定義的時候,一定要是有明确的值,且在編譯的時候就要确定,而final不需要,可以動态指定,延後指定
總結
看了上述的解釋,用來的時候有什麼建議呢?
- final用來處理隻需要初始化一次的值,比如一些類的初始參數等
- 普通的參數盡可能用var,且最好初始化,這樣可以先發享受類型安全的好處,盡可能發揮dart的性能
- 其他情況就自由發揮了