You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Dart中<< Type? variableName >>语法是什么?String? variableName中问号的作用是什么?

Dart中的Type?语法:问号到底有啥用?

嘿,刚好我对Dart的空安全特性熟得很,来给你掰扯清楚这个String? variableName;里问号的作用~

首先,这个带问号的语法是Dart 空安全(Null Safety) 特性的核心部分,它的作用非常明确:

  • String?表示这个变量是可空的String类型,意思是它既可以存储正常的字符串值,也可以被赋值为null

对比非可空类型

如果去掉问号,写成String variableName;,在Dart开启空安全的情况下,这个变量属于非可空类型

  • 它必须在声明时或者构造函数里被初始化,不能留空
  • 后续也绝对不能给它赋值null,否则编译器会直接报错

举个实际代码例子你就懂了:

// 可空String的操作:完全合法
String? nullableName = null;
nullableName = "Amir";
nullableName = null; // 没问题,编译器不会拦你

// 非可空String的操作:会报错
String nonNullableName = null; // 编译错误!非可空变量不能初始化为null
nonNullableName = "Alice";
nonNullableName = null; // 这里也会报错,不允许赋值null

适用场景

什么时候用Type?呢?当你不确定某个变量是否会有值的时候:

  • 比如从API接口获取数据,某个字段可能不存在(返回null)
  • 用户输入的内容可能为空
  • 异步操作返回的结果可能未就绪(暂时为null)

注意点:访问可空变量的安全方式

因为可空变量可能是null,直接访问它的属性或方法会触发编译错误,比如nullableName.length会报错。这时候需要用空安全的操作符来处理:

  • 空检查:先判断变量不为null,再访问
    if (nullableName != null) {
      print(nullableName.length); // 编译器知道这里变量非空,安全
    }
    
  • 空访问操作符?.:如果变量为null,整个表达式返回null,不会报错
    print(nullableName?.length); // nullableName为null时,输出null
    
  • 空合并操作符??:给变量一个默认值,如果变量为null就用默认值
    print(nullableName ?? "未知名称"); // nullableName为null时,输出"未知名称"
    

简单来说,这个问号就是给Dart编译器递了个话:“这个变量可能没值,你别太严格,允许它存null哈”,本质是帮你在编译阶段就提前规避很多潜在的空指针异常,让代码更健壮。

内容的提问来源于stack exchange,提问作者Amir

火山引擎 最新活动