Sobes.tech
Junior

Czym jest bezpieczeństwo null (null safety) w Dart?

sobes.tech AI

Odpowiedź od AI

Bezpieczeństwo null to system w Dart, który pomaga zapobiegać błędom podczas wykonywania związanym z dereferencją null. Kompilator analizuje kod i określa, czy zmienna może przechowywać wartość null. Jeśli zmienna jest zadeklarowana jako nie dopuszczająca null, kompilator gwarantuje, że nigdy nie zostanie jej przypisana wartość null.

Główne aspekty bezpieczeństwa null:

  • Domyślny typ nie null: Domyślnie typy nie dopuszczają null (non-nullable).
    // int nie może być null
    int count = 0;
    
  • Typ dopuszczający null: Aby jawnie wskazać, że zmienna może być null, używa się znaku zapytania ?:
    // String? może być null
    String? name;
    
  • Operator ! (potwierdzenie nie null): Używany do potwierdzenia, że wyrażenie dopuszczające null nie jest null. Należy używać ostrożnie, ponieważ jeśli jest null, wyrzuca wyjątek.
    String? nullableName = 'Flutter';
    // Używamy !, wiedząc, że nullableName nie jest null w tym kontekście
    print(nullableName!.length);
    
  • Operator ? (operator null-aware): Używany do bezpiecznego dostępu do członków lub wywoływania metod na wyrażeniach dopuszczających null.
    • ?. (bezpieczny dostęp):
      String? nullableString;
      // Jeśli nullableString nie jest null, wywoła length, w przeciwnym razie wynik będzie null
      int? length = nullableString?.length;
      
    • ?? (jeśli null):
      String? serverName;
      // Jeśli serverName nie jest null, używa jego wartości, w przeciwnym razie 'Guest'
      String displayName = serverName ?? 'Guest';
      
    • ??= (jeśli null, przypisz):
      String? cache;
      // Jeśli cache jest null, przypisuje 'Loading...'
      cache ??= 'Loading...';
      
  • Analiza przepływu: Kompilator Dart analizuje kod i określa, kiedy zmienna dopuszczająca null na pewno nie jest null w określonej części kodu, pozwalając na jej użycie jako nie null.
    String? greeting = getGreeting();
    // Kompilator wie, że greeting nie jest null po tej kontroli
    if (greeting != null) {
      print(greeting.toUpperCase()); // Bezpieczne użycie toUpperCase()
    }
    

Zalety bezpieczeństwa null:

  • Zmniejszenie błędów: Zapobiega NullReferenceException (lub podobnym) podczas działania.
  • Lepsza czytelność: Wyraźnie wskazuje, czy zmienna może być null.
  • Zwiększona wydajność: Kompilator może wykonywać optymalizacje, wiedząc, które zmienne na pewno nie są null.

Bezpieczeństwo null zostało wprowadzone w Dart 2.12.