[英]How to declare collections in Dart?
由於 dart 2.12 collections 構造函數已被棄用(例如: List<Foo>()
)。 鑒於此,我知道實例化 collections 的兩種方法如下:
設置示例:
final Set<String> fooSet = {};
final barSet = <String>{};
列表示例:
final List<String> fooList = [];
final barList = <String>[];
我想問一下您使用哪種方法以及為什么(優點和缺點),因為我的團隊傾向於同時使用這兩種方法。 我們想達成協議並選擇一個以保持一致性。
編輯:
我知道這兩種方法在語義上有些不同(但幾乎可以肯定它會生成相同的操作碼),因為在第一個示例中,編譯器在給定變量類型的情況下識別實例化類型,而在第二個示例中,給定實例化自動分配變量類型類型。
final List<String> fooList = <String>[];
將是兩者的顯式聲明,但編寫起來可能有些麻煩。
根據 lint,最好的方法是:
var points = [];
var addresses = <String,String>{};
var uniqueNames = <String>{};
var ids = <int>{};
var coordinates = <int,int>{};
棉絨參考: https://dart-lang.github.io/linter/lints/prefer_collection_literals.html
由於 dart 2.12 collections 構造函數已被棄用(例如:
List<Foo>()
)。
AFAIK,僅List<Foo>()
已棄用。 這已被專門棄用,因為它采用了一個指定初始大小的可選參數,這對於 null 安全性是有問題的(不再可能使用 null 元素填充不可為 null 類型的List
)。 Set
和Map
的零參數構造函數不存在該問題。
關於final List<String> fooList = [];
vs final barList = <String>[];
,這有點見仁見智,但我更喜歡后者,因為我認為它不太容易出錯。 例如,假設有人忘記顯式指定元素類型:
final List list = ['foo', 'bar', 'baz'];
很多人錯誤地認為list
將被推斷為List<String>
類型。 實際上,它將是List<dynamic>
類型,因為沒有類型參數的List
是List<dynamic>
1的簡寫,然后將從左側推斷右側。 (啟用strict-raw-types
分析選項可以幫助捕獲此類情況,但我寧願避免一開始就編寫它們。)
1這適用於所有泛型類,而不僅僅是List
。 在一般情況下,給定class Generic<T extends B> {}
,沒有類型參數的Generic
是Generic<B>
的簡寫。 如果T
不受約束,則B
是dynamic
的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.