Menu
Coddy logo textTech

? ve ! Operatörleri

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 25 / 110.

Nullable (boş bırakılabilir) türlerle çalışırken, Dart değerlere güvenli bir şekilde erişmek için iki temel operatör sunar. Null-aware access (null duyarlı erişim) operatörü ?. ve null assertion (null onaylama) operatörü !, potansiyel olarak null olan değerleri nasıl işleyeceğiniz konusunda size kontrol sağlar.

?. operatörü, null olabilen bir değer üzerindeki özelliklere veya yöntemlere güvenli bir şekilde erişir. Eğer değer null ise, tüm ifade kilitlenmek yerine null döndürür:

String? name = 'Alice';
print(name?.length);  // 5

name = null;
print(name?.length);  // null (çökme olmaz!)

! operatörü Dart'a "Bu değerin null olmadığından eminim." der. Nullable bir türü non-nullable bir türe dönüştürür, ancak değer gerçekten null ise bir hata fırlatır:

String? maybeName = 'Bob';
String definite = maybeName!;  // Tamam - null olmadığını iddia ediyoruz
print(definite.length);  // 3

String? empty = null;
// String crash = empty!;  // Çalışma zamanı hatası! Değer null idi

Null değerleri sorunsuz bir şekilde işlemek istediğinizde ?. kullanın. ! operatörünü yalnızca bir değerin var olduğundan kesinlikle emin olduğunuzda kullanın - belki bir if ifadesiyle kontrol ettikten sonra veya mantığın bir değeri garanti ettiğini bildiğinizde. ! operatörünün aşırı kullanımı null güvenliğinin amacını boşa çıkarır ve çalışma zamanı çökmelerine neden olabilir.

challenge icon

Görev

Kolay

?. ve ! operatörlerini kullanarak null olabilir (nullable) değerlerle nasıl güvenli bir şekilde çalışılacağını gösteren bir ürün envanter sistemi oluşturalım.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • product.dart: Envanterdeki bir öğeyi temsil eden bir Product sınıfı tanımlayın. Bazı ürünler tam bilgiye sahipken, diğerleri hala kataloglanıyor olabilir. Sınıfınız şunlara sahip olmalıdır:
    • Null olamaz (non-nullable) bir String name - her ürünün bir adı olmalıdır
    • Null olamaz (non-nullable) bir double price - her ürünün bir fiyatı olmalıdır
    • Null olabilir (nullable) bir String? description - bazı ürünlerin henüz açıklaması yoktur
    • Null olabilir (nullable) bir String? category - bazı ürünler henüz kategorize edilmemiştir
    • Gerekli parametreler olarak name ve price alan bir yapıcı (constructor)
    • ?. kullanarak açıklamanın uzunluğunu döndüren veya açıklama yoksa null döndüren bir getDescriptionLength() metodu
    • ! kullanarak kategoriyi büyük harflerle döndüren bir getCategoryUppercase() metodu - bu metod kategorinin ayarlanmış olduğunu varsayar
    • Ürün bilgilerini yazdıran, açıklama null olduğunda "No description" ve kategori null olduğunda "Uncategorized" gösteren bir displayProduct() metodu
  • main.dart: Ürün sınıfınızı içe aktarın ve her iki operatörü de gösterin:
    • Adı 'Laptop' ve fiyatı 999.99 olan bir ürün oluşturun, ardından açıklamasını 'High-performance computing device' ve kategorisini 'Electronics' olarak ayarlayın
    • Adı 'Mystery Item' ve fiyatı 49.99 olan bir ürün oluşturun (açıklama ve kategoriyi null olarak bırakın)
    • Laptop için: displayProduct() metodunu çağırın, getDescriptionLength() kullanarak Description length: [length] yazdırın ve getCategoryUppercase() kullanarak Category: [uppercase] yazdırın
    • Mystery Item için: displayProduct() metodunu çağırın ve getDescriptionLength() kullanarak Description length: [length] yazdırın (bu null gösterecektir)

displayProduct() metodu şu formatta yazdırmalıdır:

Product: [name] - $[price]
Description: [description or "No description"]
Category: [category or "Uncategorized"]

Beklenen çıktı:

Product: Laptop - $999.99
Description: High-performance computing device
Category: Electronics
Description length: 32
Category: ELECTRONICS
Product: Mystery Item - $49.99
Description: No description
Category: Uncategorized
Description length: null

Kopya kağıdı

Null-aware erişim operatörü ?., null olabilen değerler üzerindeki özelliklere veya metotlara güvenli bir şekilde erişir. Eğer değer null ise, bir hata fırlatmak yerine null döndürür:

String? name = 'Alice';
print(name?.length);  // 5

name = null;
print(name?.length);  // null (çökme olmaz!)

Null assertion (null kesinlik) operatörü !, null olabilen bir türü null olamaz türüne dönüştürür. Bunu yalnızca değerin null olmadığından emin olduğunuzda kullanın, çünkü değer gerçekten null ise bir çalışma zamanı hatası fırlatacaktır:

String? maybeName = 'Bob';
String definite = maybeName!;  // Tamam - null olmadığını iddia eder
print(definite.length);  // 3

String? empty = null;
// String crash = empty!;  // Çalışma zamanı hatası!

Hataları önleyen null yönetimi için ?. operatörünü, yalnızca bir değerin var olduğundan kesinlikle emin olduğunuzda ise ! operatörünü kullanın.

Kendin dene

import 'product.dart';

void main() {
  // TODO: 999.99 fiyatıyla 'Laptop' adında bir ürün oluşturun
  // Ardından açıklamasını 'High-performance computing device' olarak ayarlayın
  // Ve kategorisini 'Electronics' olarak ayarlayın
  
  // TODO: 49.99 fiyatıyla 'Mystery Item' adında bir ürün oluşturun
  // Açıklama ve kategoriyi null olarak bırakın
  
  // TODO: Laptop için:
  // - displayProduct() fonksiyonunu çağırın
  // - getDescriptionLength() kullanarak "Description length: [length]" yazdırın
  // - getCategoryUppercase() kullanarak "Category: [uppercase]" yazdırın
  
  // TODO: Mystery Item için:
  // - displayProduct() fonksiyonunu çağırın
  // - getDescriptionLength() kullanarak "Description length: [length]" yazdırın
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler