Dart空值检查惯用语或最佳做法是什么?


82

我采用以下形式的赋值和空值检查来避免在地图中进行双重查找。
在Dart中是否有更好或更惯用的方式来做到这一点?

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

Answers:


116

从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)

因此将计算nullif outgoing[a]为isnullcontains(b)if not的布尔结果。

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

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

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


书写outgoing[a]?.contains(b)是危险的,至少使用Groovy语义是危险的,因为在outgoingis时null,整个表达式的计算结果为null。因此,实际上您可能会得到类似之类的东西return (null || true),它将以检查模式抛出。
Ladicek 2013年

感谢您的公开问题链接。
2013年

@Ladicek感谢您指出这一点。我已将null-coalescing运算符(??)合并到更新后的答案中,以解决该问题。
Pixel Elephant


要检查对象字段,只需写object?.field ?? true。真正的东西可以是您想要的任何东西。
Tilo

42

现在有4个空感知运算符

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

return subject ?? "defaultIfNull";

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

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

subject ??= "defaultIfNull";

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

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

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

以下结果

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

[1, 2, null]

避免使用空值...?

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

2
关于使用?的重要说明:如果可为空的引用a具有void方法method(),则以下语法a?.method();将仅在a不为null的情况下执行方法。
Alex Semeniuk

@AlexSemeniuk,太棒了!但是有什么办法做这样的事情>>>如果a不为null ...则当该方法不是对象a的类的成员时执行方法XYZ()
Yo Apps

@YoApps我是否清楚您要执行不属于类签名的方法?我无法使用任何OOP语言进行操作。
Alex Semeniuk

@AlexSemeniuk是的,我也尝试过,没有工作,因此恢复了旧版本if(a!=null){XYZ();}
Yo Apps

1
@YoApps。哦,您的意思是这段代码。不,在Dart中是不可能的。
Alex Semeniuk

14

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

根据https://github.com/dart-lang/sdk/issues/66,似乎答案是“什么是Dart空值检查惯用法或最佳实践?” 是:

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


1
他们现在有可选的选项:-)
奥利弗·迪克森

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

尽管此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文,可以改善其长期价值。如何回答。亲切的问候。
Elletlar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.