İçindekiler:
Tip sistemlerinde null yapılabilirlik
Null yapılamayan ve null yapılabilen türler
Null yapılabilir türleri kullanma
Tip sisteminde null yapılabilirlik
Null safety, statik tip sistemde başlar çünkü diğer her şey buna dayanır. Dart programınızın içinde tam bir tür evreni vardır: int ve String gibi ilkel türler, Liste gibi koleksiyon türleri ve sizin ve kullandığınız paketlerin tanımladığı tüm sınıflar ve türler.
Tip teorisi lingo'da, Null tipi, tüm tiplerin bir alt tipi olarak ele alındı:
Bazı ifadelerde izin verilen işlemler kümesi (getters, setters, methods ve operatörler) türüne göre tanımlanır. Tür Liste ise, üzerinde .add() veya [] öğesini çağırabilirsiniz. Eğer int ise, + arayabilirsiniz. Ancak null value, bu methodlardan hiçbirini tanımlamaz. Null'un başka türden bir ifadeye akmasına izin vermek, bu işlemlerden herhangi birinin başarısız olabileceği anlamına gelir. Bu gerçekten null referans hatalarının en önemli noktasıdır - her başarısızlık null üzerinde sahip olmadığı bir method veya property aramaya çalışmaktan kaynaklanır.
Null yapılamayan ve null yapılabilen türler
Null safety, tür hiyerarşisini değiştirerek bu sorunu kökünden ortadan kaldırır. Null türü hala vardır, ancak artık tüm türlerin bir alt türü değildır. Bunun yerine, tür hiyerarşisi şöyle görünür:
Null artık bir alt tür olmadığından, özel Null sınıfı dışında hiçbir tür null değerine izin vermez. Bu tüm türlerin varsayılan olarak null yapılamaz hale geldiğini ifade eder.
// Using null safety:
makeCoffee(String coffee, [String? dairy]) {
if (dairy != null) {
print('$coffee with $dairy');
} else {
print('Black $coffee');
}
}
Null yapılabilir türleri kullanmak
// Varsayımsal sağlam olmayan boş güvenlik:
bad(String? maybeString) {
print(maybeString.length);
}
main() {
bad(null);
}
Null yapılamayan bir türü, null yapılabilir bir tür bekleyen bir şeye geçirmek her zaman güvenlidir.
Null yapılabilir bir tür bekleyen bir şeye güvenle null iletebilirsiniz, bu nedenle Null ayrıca her null yapılabilir türün bir alt türüdür:
Ancak diğer yöne gitmek ve null yapılabilir bir türü, temeldeki null olmayan türü bekleyen bir şeye geçirmek güvenli değildir.
// Varsayımsal sağlam olmayan boş güvenlik:
requireStringNotNull(String definitelyString) {
print(definitelyString.length);
}
main() {
String? maybeString = null; // Or not!
requireStringNotNull(maybeString);
}
Bu program güvenli değildir. Bununla birlikte, Dart her zaman implicit downcasts (örtük düşüşler) denilen bir şeye sahiptir. Örneğin, String bekleyen bir fonksiyona Object türünde bir değer iletirseniz, tür denetleyicisi buna izin verir:
// null safety olmadan:
requireStringNotObject(String definitelyString) {
print(definitelyString.length);
}
main() {
Object maybeString = 'it is';
requireStringNotObject(maybeString);
}
Sağlamlığı korumak için derleyici, requireStringNotObject() argümanına sessizce bir as String dökümü ekler. Bu döküm, çalışma zamanında başarısız olabilir ve bir istisna oluşturabilir, ancak derleme zamanında Dart, bunun sorun olmadığını söyler. Null yapılamayan türler, null yapılabilir türlerin alt türleri olarak modellendiğinden, implicit downcasts String? bekleyen bir şeye bir String'i geçmenize izin verir.
// Using null safety:
requireStringNotObject(String definitelyString) {
print(definitelyString.length);
}
main() {
Object maybeString = 'it is';
requireStringNotObject(maybeString as String);
}
// null safety olmadan:
List<int> filterEvens(List<int> ints) {
return ints.where((n) => n.isEven);
}
Hatayı fark ettiniz mi? .where() yöntemi lazy'dir, bu nedenle bir Liste değil Iterable bir değer döndürür.
Bu resimde null yapılamayan türlerden oluşan bir bölge vardır. Bu türler, tüm ilginç yöntemlere erişmenize izin verir, ancak hiçbir zaman null içeremez. Ve sonra karşılık gelen tüm null yapılabilir türlerin paralel bir ailesi vardır. Bunlar null'a izin verir, ancak onlarla fazla bir şey yapamazsınız.
devamı bir sonraki yazıda ...😴
Top comments (0)