110

我有以下形式的赋值和空检查,以避免在我的地图中重复查找。
在 Dart 中是否有更好或更惯用的方法来做到这一点?

bool isConnected(a, b){
  List list;
  return (
    ((list = outgoing[a]) != null && list.contains(b)) ||
    ((list = incoming[a]) != null && list.contains(b))
  );
}
4

4 回答 4

155

从 Dart 1.12 开始,可用于此类情况的空值感知运算符:

bool isConnected(a, b) {
  bool outConn = outgoing[a]?.contains(b) ?? false;
  bool inConn = incoming[a]?.contains(b) ?? false;
  return outConn || inConn;
}

如果?.左侧为 null,则运算符短路为 null,如果不为 null,则??运算符返回左侧,否则返回右侧。

该声明

outgoing[a]?.contains(b)

因此将评估为nullif outgoing[a]isnullcontains(b)if it is not 的布尔结果。

这意味着生成的语句将是以下之一:

bool outConn = null ?? false; // false
bool outConn = false ?? false; // false
bool outConn = true ?? false; // true

这同样适用于inConn布尔值,这意味着两者inConnoutConn都保证为非空,允许我们返回两者的结果||

于 2013-06-09T06:13:38.797 回答
101

现在有4 个null 感知运算符

?? 如果主题为空,则提供默认值

return subject ?? "defaultIfNull";

??= 仅当主题为空时才将主题设置为默认值

这类似于?? 但如果它为空,则将主题变量设置为默认值。

subject ??= "defaultIfNull";

?. 如果左侧的对象为 null,则避免异常,返回 null 或不执行函数/方法

object?.x如果 object 为 null,将返回 null,如果 object 为 null,object.x将导致异常

这也可以在调用方法时使用。例如

对于 void 方法,object?.myVoidMethod()- 如果object为 null 则myVoidMethod不会执行。

对于返回值的方法object?.returnValueMethod()- 如果object为 null,则returnValueMethod返回 null。

它也可以与call运算符一起用于函数调用。例如myCallbackFunction?.call(),仅当 myFunction 不为空时才会执行。

...?从展开集合中,如果主题列表为空,则避免在最终列表中出现空项目

以下结果

[
  ...[1, 2],
  null,
]

[1, 2, null]

避免使用空值...?

var resultingList = [
  ...[1, 2],
  ...?subjectList,
];
于 2019-09-20T11:33:41.840 回答
18

发布以下内容,因为我最终通过搜索标题来到这里。

根据https://github.com/dart-lang/sdk/issues/66,似乎“什么是 Dart 空值检查习惯用法或最佳实践?”的答案 是:

在一般情况下,没有空值检查习惯用法或最佳实践。如果 null 感知运算符不适合您的情况,请使用直接比较,如if (object == null)or if (object != null)

于 2016-12-22T16:59:06.503 回答
3
bool ok<T>(T obj) => obj != null;
bool nul<T>(T obj) => obj == null;
于 2020-11-06T15:07:23.367 回答