飞镖零安全!vs?-



之间到底有什么区别

String id = folderInfo!.first.id;   //this works

String id = folderInfo?.first.id; //this is an error

我知道?。当value对象为null时返回null,但是执行!的操作!。回来

?.被称为条件成员访问

最左边的操作数可以为null;例如:foo?。bar从表达式foo中选择属性bar,除非foo为null(在这种情况下,foo?.bar的值为null(

在您的情况下,String id意味着id不能具有null值。但是使用?.可以返回null,这就是它显示错误的原因。

!.如果您知道表达式的计算结果从不为null,则使用

例如,int类型的变量?可能是一个整数,也可能是null。如果您知道一个表达式的计算结果从不为null,但Dart不同意,那么您可以添加!来断言它不是null(如果是null,则抛出异常(。

更多和参考:零位安全和操作员的重要概念。

断言运算符(!(

如果确定nullable表达式不是null,则使用nullassertion运算符(!(使Dart将其视为不可为null。

换句话说,将抛出一个error,如果value为空,并将破坏您的函数,正如您所知将在不中断的情况下返回null。

如果变量为null,则!会抛出错误。如果可能的话,你应该尽量避免这种情况。

如果您确定具有可为null类型的表达式不是null,则可以使用null断言运算符(!(使Dart将其视为不可为null。通过添加!在表达式之后,您告诉Dart该值不会为null,并且将其分配给不可为null的变量是安全的。

在第一种情况下,您定义id不可为null,但当您设置可为null的值时,就会抛出错误。

String id = folderInfo?.first.id; 

在第二种情况下,当您使用断言运算符(!(时,它实际上告诉编译器它必须是不可为null的。

最新更新