#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]);