【问题标题】:What is the Dart null checking idiom or best practice?Dart 空值检查习惯用法或最佳实践是什么?
【发布时间】:2013-06-05 02:13:14
【问题描述】:

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

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

【问题讨论】:

    标签: dart


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • outgoing[a]?.contains(b) 是危险的,至少对于Groovy 语义来说是这样,因为当outgoingnull 时,整个表达式的计算结果为null。所以你实际上可能会得到类似return (null || true) 的东西,它会进入检查模式。
    • 感谢开放问题链接。
    • @Ladicek 感谢您指出这一点。我已将 null-coalescing 运算符 (??) 合并到我的更新答案中以解决该问题。
    • 要检查对象字段只需写object?.field ?? true。 true 可以是你想要的任何东西。
    【解决方案2】:

    现在有 4 个可识别 null 的运算符

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

    return subject ?? "defaultIfNull";
    

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

    这类似于??但如果主题变量为空,则将其设置为默认值。

    subject ??= "defaultIfNull";
    

    ?。如果左边的对象为空,则避免异常,返回空或不执行函数/方法

    object?.x 对象为空时返回空值,object.x 对象为空时抛出异常

    这也可以在调用方法时使用。例如

    对于 void 方法,object?.myVoidMethod() - 如果 object 为 null,则 myVoidMethod 将不会执行。

    对于返回值 object?.returnValueMethod() 的方法 - 如果 object 为 null,则 returnValueMethod 将返回 null。

    它也可以与call 运算符一起用于函数调用。例如myCallbackFunction?.call() 只会在 myFunction 不为 null 时执行。

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

    下面的结果

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

    [1, 2, null]

    为了避免空值使用...?

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

    【讨论】:

    • 关于使用 ?. 的重要说明:如果可空引用 a 具有 void 方法 method(),则以下语法 a?.method(); 将仅在 a 为不为空。
    • @AlexSemeniuk,好点子!但是有没有办法做这样的事情>>>如果a不为空......然后执行一个方法XYZ(),当这个方法不是对象a的类的成员时???
    • @YoApps 我是否清楚您要执行一个不属于类签名的方法?不可能用任何我知道的 OOP 语言来做。
    • @AlexSemeniuk 是的,我也试过了,没用所以恢复到旧的if(a!=null){XYZ();}
    • @YoApps。哦,你的意思是这段代码。不,这在 Dart 中是不可能的。
    【解决方案3】:

    发布以下内容,因为我最终通过搜索标题来到这里。

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

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

    【讨论】:

    • 他们现在有选项了 :-)
    【解决方案4】:
    bool ok<T>(T obj) => obj != null;
    bool nul<T>(T obj) => obj == null;
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。 How to Answer。亲切的问候。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多