在Dart语言中关于问号和感叹号的使用有如下几种: ?、??、??=、! 下面就说说这几种符号的理解。 # 一、? ## 理解 **可空类型操作符,也可以用作判空。** ### 1、作为可空类型操作符 如:`String? name;` 表示name变量是一个可空类型的字符串,可以将name赋值为null,若String后面不加操作符?则当前变量不能为null,必须赋具体的值。 **注意:**使用 ?操作符的属性是可空类型的,该属性可能为null,所以在使用的时候要先判空。可以使用`??、??=、!`来判空。 ### 2、用作判空 用作判空时,使用形式是:`?.` 如: `user?.name = '张三';` 这里的?操作符的作用是**判空**,若user是空的,则返回null,这句代码相当于没有赋值成功,若user不是空的,则`user.name`赋值成功。 用作判空的`?`的使用可以跟下面`!`的使用做个对比。 1、左边?.右边 如果左边为null则返回null,如果左边不为null则返回右边; 2、左边!.右边 如果左边为null则抛出异常,代码不会再继续向下执行,如果左边不为null则返回右边。 # 二、?? 理解: >**是判空运算符。**顾名思义,先判断变量是否是NULL,空则选择运算符右边变量执行操作;非空则选择左边变量。 使用: `str ?? '张三'` 表示如果str是空的,则返回‘张三’,str不是空的则返回str的值 # 三、??= 理解: >**是判空赋值运算符。**顾名思义,就是先判断变量是否是NULL,空则运算符左边的变量用右边变量赋值后,再执行操作;非空则运算符左边变量直接执行操作。 使用: `str ??= '张三'` 表示如果str是NULL,则将‘张三’赋值给str再使用str,str不是空的则直接使用str。 # 四、! **1、理解:** **空检查操作符,为空则会抛出异常。** 如`str!.value`,当str为空时会抛出异常,不为空时正常返回`str.value`。 **2、举个栗子:** ```dart //定义一个可为空的User User? user; //情况1、不赋值,直接使用 user!.name = '张三'; //情况2、赋值后再使用 user = new User(); user!.name = '张三'; ``` 情况1、在运行的时候会报错,报错信息是:`Null check operator used on a null value`空检查运算符用于空值。 情况2、则可以正常将`user.name`的值设置为‘张三’。 **3、注意:** 因此在使用!时最好try...catch...一下,或者先判断一下要使用的对象是否为null,不为null则使用,避免上述报错,!使用时要慎重. 参考: [Flutter随记四:null safe之 ??= 和??和 ?使用区别](https://blog.csdn.net/weixin_38201372/article/details/125440736 "Flutter随记四:null safe之 ??= 和??和 ?使用区别") [flutter学习笔记之Dart-8 问号、双问号、感叹号的理解](https://blog.csdn.net/qq_34707150/article/details/123483853?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-123483853-blog-125440736.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-123483853-blog-125440736.pc_relevant_aa&utm_relevant_index=1 "flutter学习笔记之Dart-8 问号、双问号、感叹号的理解") 最后编辑:2022年12月08日 ©著作权归作者所有
最新回复