List () yapıcısına neden Dart'ın boş güvenliğinde erişilemiyor?

Aug 17 2020

NNBD ile, varsayılan kurucuyu kullanarak listeyi başlatmanıza izin verilmez:

List<int> foo = List(); // Compile time error

Ancak yine de yapabilirsiniz:

List<int> foo = []; // No error

Öyleyse, ikisi arasındaki fark nedir? Ya her ikisi de hatayı göstermeli ya da hiçbirini göstermemelidir.

Yanıtlar

5 lrn Aug 18 2020 at 03:30

ListYapıcı iki kullanımını vardı:

  • new List()büyütülebilir boş bir liste oluşturmak için [].
  • new List(n)değerlerle ndolu sabit uzunlukta bir uzunluk listesi oluşturmak içinnull

Boş güvenlik ile, ikinci kullanım çoğu zaman sağlam değildi ve bunu düzeltmenin iyi bir yolu yoktu. Bu olmayan null olmak için bir tür bağımsız değişkeni zorlamak mümkün, ama List<T>(4)yalnızca çalışır Tolduğunu null . Bunu uygulamanın hiçbir yolu yok.

Bu nedenle, List(n)gitmesi gereken mod ( List.filled(n, value)sizi bir dolgu değeri sağlamaya zorlayan ile değiştirilir ). O sol List(), aslında kendi ağırlığını taşımıyor. Bunun []yerine kullanabilirsiniz (ve yapmalısınız !), Bu nedenle kurucunun tamamen kaldırılmasına karar verildi - tüm kullanımları ya güvensiz ya da yararsızdı. (Ayrıca, zaten garip bir kurucuydu, çünkü onu düzgün bir şekilde null güvenli hale getirmek isteseydik, null yapılamayan tipte isteğe bağlı bir parametreye sahip olacak ve varsayılan değeri olmayacaktı.)

Tamamen kaldırarak List, gelecekte muhtemelen daha kısa bir takma ad olarak yeni bir kurucu tanıtmayı mümkün kılar List.filled. Umut edilebilir.