我采用以下形式的赋值和空值检查来避免在地图中进行双重查找。
在Dart中是否有更好或更惯用的方式来做到这一点?
bool isConnected(a, b){
List list;
return (
((list = outgoing[a]) != null && list.contains(b)) ||
((list = incoming[a]) != null && list.contains(b))
);
}
Answers:
从Dart 1.12开始,可在这种情况下使用空感知运算符:
bool isConnected(a, b) {
bool outConn = outgoing[a]?.contains(b) ?? false;
bool inConn = incoming[a]?.contains(b) ?? false;
return outConn || inConn;
}
该?.
运营商短路到零,如果左侧为空,而??
如果它不为空,而右侧否则运算符返回左侧。
该声明
outgoing[a]?.contains(b)
因此将计算null
if outgoing[a]
为isnull
或contains(b)
if not的布尔结果。
这意味着结果语句将是以下之一:
bool outConn = null ?? false; // false
bool outConn = false ?? false; // false
bool outConn = true ?? false; // true
这同样适用于inConn
布尔值,这意味着双方inConn
并outConn
保证是无空,让我们返回的结果||
荷兰国际集团两个。
??
)合并到更新后的答案中,以解决该问题。
object?.field ?? true
。真正的东西可以是您想要的任何东西。
现在有4个空感知运算符
return subject ?? "defaultIfNull";
这类似于?? 但是将主题变量设置为默认值(如果为null)。
subject ??= "defaultIfNull";
object?.x
如果object为null将返回null,如果object为nullobject.x
将导致异常
以下结果
[
...[1, 2],
null,
]
是 [1, 2, null]
避免使用空值...?
var resultingList = [
...[1, 2],
...?subjectList,
];
a
具有void方法method()
,则以下语法a?.method();
将仅在a
不为null的情况下执行方法。
if(a!=null){XYZ();}
发布以下内容,因为我最终在这里搜索了标题。
根据https://github.com/dart-lang/sdk/issues/66,似乎答案是“什么是Dart空值检查惯用法或最佳实践?” 是:
在一般情况下,没有null检查习惯或最佳实践。如果知道空值的运算符不适合您的情况,请使用if (object == null)
或中的直接比较if (object != null)
。
outgoing[a]?.contains(b)
是危险的,至少使用Groovy语义是危险的,因为在outgoing
is时null
,整个表达式的计算结果为null
。因此,实际上您可能会得到类似之类的东西return (null || true)
,它将以检查模式抛出。