Menu
Coddy logo textTech

Operatory ? i !

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 25 z 110.

Podczas pracy z typami dopuszczającymi wartość null Dart udostępnia dwa niezbędne operatory bezpiecznego dostępu do wartości. Operator dostępu uwzględniający null ?. i operator asercji non-null ! pozwalają kontrolować sposób obsługi wartości, które mogą być null.

Operator ?. bezpiecznie uzyskuje dostęp do właściwości lub metod wartości dopuszczającej null. Jeśli wartość to null, całe wyrażenie zwraca null zamiast powodować awarię:

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

name = null;
print(name?.length);  // null (bez awarii!)

Operator ! mówi Dart: „Mam pewność, że ta wartość nie jest null”. Zmienia typ dopuszczający null na typ niedopuszczający null, ale zgłasza błąd, jeśli wartość faktycznie jest null:

String? maybeName = 'Bob';
String definite = maybeName!;  // OK - stwierdzamy, że nie jest null
print(definite.length);  // 3

String? empty = null;
// String crash = empty!;  // Błąd wykonania! Wartość była null

Używaj ?., gdy chcesz bezpiecznie obsługiwać wartości null. Używaj ! tylko wtedy, gdy masz całkowitą pewność, że wartość istnieje — na przykład po sprawdzeniu jej za pomocą instrukcji if albo gdy wiesz, że logika gwarantuje istnienie wartości. Nadmierne używanie ! niweczy cel bezpieczeństwa null i może prowadzić do awarii w czasie działania.

challenge icon

Wyzwanie

Łatwy

Stwórzmy system ewidencji produktów, który pokaże, jak bezpiecznie pracować z wartościami dopuszczającymi null przy użyciu operatorów ?. i !.

Utworzysz dwa pliki, aby uporządkować swój kod:

  • product.dart: Zdefiniuj klasę Product, która reprezentuje produkt w ewidencji. Niektóre produkty mają kompletne informacje, a inne są jeszcze katalogowane. Twoja klasa powinna zawierać:
    • Niedopuszczające null String name — każdy produkt musi mieć nazwę
    • Niedopuszczające null double price — każdy produkt musi mieć cenę
    • Dopuszczające null String? description — niektóre produkty nie mają jeszcze opisu
    • Dopuszczające null String? category — niektóre produkty nie zostały jeszcze przypisane do kategorii
    • Konstruktor, który przyjmuje name i price jako wymagane parametry
    • Metodę getDescriptionLength(), która zwraca długość opisu przy użyciu ?. lub null, jeśli nie ma opisu
    • Metodę getCategoryUppercase(), która zwraca kategorię wielkimi literami przy użyciu ! — ta metoda zakłada, że kategoria została ustawiona
    • Metodę displayProduct(), która wyświetla informacje o produkcie, pokazując No description, gdy opis ma wartość null, oraz Uncategorized, gdy kategoria ma wartość null
  • main.dart: Zaimportuj klasę produktu i pokaż działanie obu operatorów:
    • Utwórz produkt o nazwie 'Laptop' i cenie 999.99, a następnie ustaw jego opis na 'High-performance computing device' i kategorię na 'Electronics'
    • Utwórz produkt o nazwie 'Mystery Item' i cenie 49.99 (pozostaw opis i kategorię jako null)
    • Dla Laptopa: wywołaj displayProduct(), wyświetl Description length: [length] przy użyciu getDescriptionLength() i wyświetl Category: [uppercase] przy użyciu getCategoryUppercase()
    • Dla Mystery Item: wywołaj displayProduct() i wyświetl Description length: [length] przy użyciu getDescriptionLength() (pojawi się null)

Metoda displayProduct() powinna wyświetlać informacje w następującym formacie:

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

Oczekiwany wynik:

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

Spróbuj swoich sił

import 'product.dart';

void main() {
  // TODO: Utwórz produkt o nazwie 'Laptop' i cenie 999.99
  // Następnie ustaw jego opis na 'High-performance computing device'
  // I ustaw jego kategorię na 'Electronics'
  
  // TODO: Utwórz produkt o nazwie 'Mystery Item' i cenie 49.99
  // Pozostaw opis i kategorię jako null
  
  // TODO: Dla produktu Laptop:
  // - Wywołaj displayProduct()
  // - Wypisz "Description length: [length]", używając getDescriptionLength()
  // - Wypisz "Category: [uppercase]", używając getCategoryUppercase()
  
  // TODO: Dla produktu Mystery Item:
  // - Wywołaj displayProduct()
  // - Wypisz "Description length: [length]", używając getDescriptionLength()
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online