什么是 ??达特的双重问号?

Sur*_*gch 39 operators dart

以下代码行有两个问号:

final myStringList = prefs.getStringList('my_string_list_key') ?? [];
Run Code Online (Sandbox Code Playgroud)

什么意思?

这是一个Q&A风格的自答案帖子.我记得在从Java学习Swift之后,这让我很困惑.我想对于新的Dart学习者来说会是一样的,我在Stack Overflow上找不到它的问题.我的答案如下.

Sur*_*gch 66

??双问号运算符的意思是"如果空".例如,采用以下表达式.

String a = b ?? 'hello';
Run Code Online (Sandbox Code Playgroud)

这意味着a等于b,但如果b为null则a等于'hello'.

另一个相关运营商是??=.例如:

b ??= 'hello';
Run Code Online (Sandbox Code Playgroud)

这意味着如果b为null,则将其设置为等于hello.否则,请勿更改它.

参考

注意

  • 在Swift ??中称为nil-coalescing运算符,其中nil表示null.但是,我无法??=在Dart文档中找到运营商的正式名称.

  • 有趣的是为什么??而不是 ?:,对于来自 PHP 的人来说这是相当误导的,因为 ?? 在PHP中的意思完全相反。 (3认同)
  • @Vedmant可能是因为三元运算符已经使用了“?”:“String a = b == true?” “x”:“y”;`。if-null 运算符实际上只是三元 null 检查的简写,例如 `String a = a == null ?'你好:a;`。 (2认同)

May*_*wal 16

(??) null 运算符,它返回其上的表达式left when the it's not null,否则将返回正确的表达式。

(??=) Null 感知赋值- 仅当该变量当前为 null 时,该运算符才将值分配给其左侧的变量。

(?.) Null-Aware 访问该运算符可防止您尝试访问可能为 null 的对象的属性或方法而导致应用程序崩溃。例如,

String x;
print(x.toUpperCase());   // WILL GIVE AN ERROR
print(x?.toUpperCase()); // OUTPUT WILL BE NULL
Run Code Online (Sandbox Code Playgroud)

(...?) Null-Aware 扩展运算符- 该运算符可防止您使用扩展运算符添加 null 元素。


小智 8

Dart 提供了一些方便的运算符来处理可能为 null 的值。一个是 ??= 赋值运算符,它仅在变量当前为空时才为该变量赋值:

int a; // The initial value of a is null.
a ??= 3;
print(a); // <-- Prints 3.

a ??= 5;
print(a); // <-- Still prints 3.
Run Code Online (Sandbox Code Playgroud)

另一个可感知空值的运算符是 ?? , 返回其左侧的表达式,除非该表达式的值为 null,在这种情况下,它会计算并返回其右侧的表达式:

print(1 ?? 3); // <-- Prints 1.
print(null ?? 12); // <-- Prints 12.
Run Code Online (Sandbox Code Playgroud)