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

时间:2013-06-09 05:12:43

标签: dart

我有以下形式的作业和null检查以避免在我的地图中进行双重查找 在Dart中有更好或更惯用的方法吗?

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

4 个答案:

答案 0 :(得分:53)

从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;
}

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

声明

outgoing[a]?.contains(b)
因此,如果nulloutgoing[a]

将评估为null,如果不是contains(b),则评估为bool outConn = null ?? false; // false bool outConn = false ?? false; // false bool outConn = true ?? false; // true

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

inConn

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

答案 1 :(得分:11)

现在有 4 个空值运算符

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

return subject ?? "defaultIfNull";

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

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

subject ??= "defaultIfNull";

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

object?.x将在对象为null时返回null,object.x将在对象为null时引发异常

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

以下结果

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

[1, 2, null]

为避免使用空值,请使用...?

var resultingList = [
  ...[1, 2],
  ...?subjectList,
];

答案 2 :(得分:9)

发布以下内容,因为我最终搜索了标题。

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

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

答案 3 :(得分:0)

bool ok<T>(T obj) => obj != null;
bool nul<T>(T obj) => obj == null;