什么是Dart null检查成语或最佳实践?

z5h*_*z5h 51 dart

我有以下形式的赋值和空值检查,以避免在我的地图中进行双重查找.
在Dart中有更好或更惯用的方法吗?

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

Pix*_*ant 78

从Dart 1.12开始,null-aware运算符可用于此类情况:

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

?.运营商短路为空,如果左侧为空,而??如果不是空操作符返回左边和右边,否则.

该声明

outgoing[a]?.contains(b)
Run Code Online (Sandbox Code Playgroud)

因此将评估为nullif ,或者是否 outgoing[a]null布尔结果contains(b).

这意味着结果语句将是以下之一:

bool outConn = null ?? false; // false
bool outConn = false ?? false; // false
bool outConn = true ?? false; // true
Run Code Online (Sandbox Code Playgroud)

这同样适用于inConn布尔值,这意味着双方inConnoutConn保证是无空,让我们返回的结果||荷兰国际集团两个.

  • 终于登陆了\ o/https://github.com/gbracha/nullAwareOperators/blob/master/proposal.md (2认同)

sta*_*anm 12

发布以下内容,因为我通过搜索标题结束了这里.

根据https://github.com/dart-lang/sdk/issues/66,似乎答案为"什么是Dart null检查成语或最佳实践?" 是:

在一般情况下,没有空检查习惯用法或最佳做法.如果null-aware运算符不适合您的情况,请使用if (object == null)或中的直接比较if (object != null).

  • 他们没有可选项真是可惜,这在我们一些较大的项目中引起了很多问题:-/ (3认同)
  • 他们现在有选择了:-) (2认同)

atr*_*eon 8

现在有4个空感知运算符

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

return subject ?? "defaultIfNull";
Run Code Online (Sandbox Code Playgroud)

?? =仅在主题为null时将主题设置为默认主题

这类似于?? 但是将主题变量设置为默认值(如果为null)。

subject ??= "defaultIfNull";
Run Code Online (Sandbox Code Playgroud)

?如果在访问主题的属性时主题为null,请避免出现异常

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

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

以下结果

[
  ...[1, 2],
  null,
]
Run Code Online (Sandbox Code Playgroud)

[1, 2, null]

避免使用空值...?

var resultingList = [
  ...[1, 2],
  ...?subjectList,
];
Run Code Online (Sandbox Code Playgroud)

  • 这是很棒的信息。感谢您的帖子! (2认同)
  • 关于使用 __?.__ 的重要说明:如果可为 null 的引用 `a` 具有 void 方法 `method()`,则以下语法 `a?.method();` 仅当 `a` 不为 null 时才会执行方法。 (2认同)