Dart 空检查的习惯用法或最佳实践是什么?

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

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

自 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,如果左边为非空,则 ??操作符返回左边,否则返回右边。

声明

outgoing[a]?.contains(b)

因此,如果 outgoing[a]null,则计算结果为 null; 如果不是,则计算结果为 contains(b)的布尔值。

That means the resulting statement will be one of the following:

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

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

张贴以下内容,因为我在这里搜索了标题。

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

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

现在有 4空感知运算符

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

return subject ?? "defaultIfNull";

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

This is similar to ?? but sets the subject variable to a default if it is null.

subject ??= "defaultIfNull";

?.如果左边的对象为 null,则避免异常,返回 null 或不执行 function/method

如果对象为空,则 object?.x将返回 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]

to avoid the null value use ...?

var resultingList = [
...[1, 2],
...?subjectList,
];
bool ok<T>(T obj) => obj != null;
bool nul<T>(T obj) => obj == null;