В чем разница между? и ! в таких коллекциях, как Map, List и Set?

#dart #dart-null-safety

#dart #dart-null-безопасность

Вопрос:

В чем разница между ? и ! при использовании в коллекции в Dart?


Скажем, у меня есть:

 var list = [1, 2];
  

Теперь я могу либо использовать

 print(list?[0]); // prints 1
  

или

 print(list![0]); // also prints 1
  

Кажется, что оба они выполняют одну и ту же работу, так в чем же разница?

Ответ №1:

Похоже, что оба они выполняют одну и ту же работу, потому что ваш list имеет тип List<int> (ненулевой), а не List<int>? (обнуляемый). Если бы ваш список имел тип с нулевым значением, например:

 List<int>? list;
  

вы бы увидели разницу.


Использование ? (оператор с нулевым значением)

Было бы безопасно использовать, ? потому что в случае, если list есть null , list?[0] все равно будет печататься null , а не выдавать ошибку.

 print(list?[0]); // Safe
  

или вы могли бы также использовать ?? для предоставления значения по умолчанию.

 print(list?[0] ?? -1); // Safe. Providing -1 as default value in case the list is null 
  

Использование ! (оператор Bang)

Однако, ! выдает ошибку времени выполнения, потому что вы явно говорите, что ваш list не null , и вы понижаете его значение с нулевого до ненулевого:

 print(list![0]); // Not safe. May cause runtime error if list is null
  

Это эквивалентно

 print((list as List)[0]);