Sobes.tech
Junior

Какво е нулева безопасност (null safety) в Dart?

sobes.tech AI

Отговор от AI

Нулевата безопасност е система в Dart, която помага да се предотвратят грешки по време на изпълнение, свързани с разыменуване на null. Компилаторът анализира кода и определя дали променливата може да съдържа стойност null. Ако променливата е обявена като не допускаща null, компилаторът гарантира, че никога няма да бъде присвоена стойност null.

Основни аспекти на нулевата безопасност:

  • Неявен тип без null: По подразбиране типовете не позволяват null (non-nullable).
    // int не може да бъде null
    int count = 0;
    
  • Тип, допускащ null: За явно указване, че променливата може да бъде null, се използва въпросителен знак ?:
    // String? може да бъде null
    String? name;
    
  • Оператор ! (non-null assertion): Използва се за потвърждение, че изразът, допускащ null, не е null. Трябва да се използва с внимание, тъй като при null ще се хвърли изключение.
    String? nullableName = 'Flutter';
    // Използваме !, знаейки, че nullableName не е null в този контекст
    print(nullableName!.length);
    
  • Оператор ? (null-aware оператори): Използва се за безопасен достъп до членове или извиквания на методи върху изрази, допускащи null.
    • ?. (null-aware достъп):
      String? nullableString;
      // Ако nullableString не е null, ще се извика length, иначе резултатът ще е null
      int? length = nullableString?.length;
      
    • ?? (ако null):
      String? serverName;
      // Ако serverName не е null, се използва неговата стойност, иначе 'Guest'
      String displayName = serverName ?? 'Guest';
      
    • ??= (ако null, присвояване):
      String? cache;
      // Ако cache е null, се присвоява 'Loading...'
      cache ??= 'Loading...';
      
  • Анализ на поток (Flow Analysis): Компилаторът Dart анализира кода и определя кога променливата, допускаща null, е гарантирано не null в определена част от кода, позволявайки да се използва като не допускаща null.
    String? greeting = getGreeting();
    // Компилаторът знае, че greeting не е null след тази проверка
    if (greeting != null) {
      print(greeting.toUpperCase()); // Може безопасно да се използва toUpperCase()
    }
    

Предимства на нулевата безопасност:

  • Намаляване на грешките: Предотвратява NullReferenceException (или подобни) по време на изпълнение.
  • Подобрена четливост: Явно указва дали променливата може да бъде null.
  • Повишена производителност: Компилаторът може да извършва оптимизации, знаейки кои променливи са гарантирано не null.

Нулевата безопасност беше въведена в Dart 2.12.