Назад к вопросам
Junior
231
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech 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 operators): Используется для безопасного доступа к членам или вызовам методов null-допускающих выражений.
    • ?. (null-aware access):
      String? nullableString;
      // Если nullableString не null, будет вызвана length, иначе результат будет null
      int? length = nullableString?.length;
      
    • ?? (if null):
      String? serverName;
      // Если serverName не null, используется его значение, иначе 'Guest'
      String displayName = serverName ?? 'Guest';
      
    • ??= (if null assign):
      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.