我有以下形式的赋值和空检查,以避免在我的地图中重复查找。
在 Dart 中是否有更好或更惯用的方法来做到这一点?
bool isConnected(a, b){
List list;
return (
((list = outgoing[a]) != null && list.contains(b)) ||
((list = incoming[a]) != null && list.contains(b))
);
}
我有以下形式的赋值和空检查,以避免在我的地图中重复查找。
在 Dart 中是否有更好或更惯用的方法来做到这一点?
bool isConnected(a, b){
List list;
return (
((list = outgoing[a]) != null && list.contains(b)) ||
((list = incoming[a]) != null && list.contains(b))
);
}
从 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)
因此将评估为null
if outgoing[a]
isnull
或contains(b)
if it is not 的布尔结果。
这意味着生成的语句将是以下之一:
bool outConn = null ?? false; // false
bool outConn = false ?? false; // false
bool outConn = true ?? false; // true
这同样适用于inConn
布尔值,这意味着两者inConn
和outConn
都保证为非空,允许我们返回两者的结果||
。
现在有4 个null 感知运算符
return subject ?? "defaultIfNull";
这类似于?? 但如果它为空,则将主题变量设置为默认值。
subject ??= "defaultIfNull";
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,
];
发布以下内容,因为我最终通过搜索标题来到这里。
根据https://github.com/dart-lang/sdk/issues/66,似乎“什么是 Dart 空值检查习惯用法或最佳实践?”的答案 是:
在一般情况下,没有空值检查习惯用法或最佳实践。如果 null 感知运算符不适合您的情况,请使用直接比较,如if (object == null)
or if (object != null)
。
bool ok<T>(T obj) => obj != null;
bool nul<T>(T obj) => obj == null;