为什么`== null`优于`是Null`?

时间:2014-02-18 22:42:17

标签: dart

在Dart中,检查值为== null似乎与检查is Null类似。为什么前者更可取?

3 个答案:

答案 0 :(得分:6)

这是您正在进行的比较类型。在== null中,您将对象/原型与null进行比较,而在后者中,is Nullnull是一个对象。它在编译器中没有任何区别。

== null更有利,因为被比较的两个可以是原语,这可以节省系统中的内存。

答案 1 :(得分:3)

来自其他流行语言的开发人员对

== null很熟悉。

答案 2 :(得分:2)

使用此类型检查Dart不是很正确。

if(value is Null) {
}

在Dart中,null的静态类型为bottom type

我们知道,底部类型是所有类型的子类型。

现在我们在Dart中测试子类型(包括bottom类型的值,null

void main() {
  var subtype = new Subtype();
  var typeOfBase = new TypeOf<Base>();
  test(subtype, typeOfBase);
  test(null, typeOfBase);
}

void test(value, TypeOf typeOf) {
  var type = typeOf.type;
  var runtimeType = value.runtimeType;
  if(typeOf.isSubtypeOf(value)) {
    print("Value [$value] of type [$runtimeType] is a subtype of [$type[");
  } else {
    print("Value [$value] of type [$runtimeType] is NOT a subtype of [$type]");
  }
}

class Base {
}

class Subtype implements Base {
  String toString() => "subtype";
}

class TypeOf<T> {
  Type get type => T;

  bool isSubtypeOf(value) => value is T;
}

结果:

Value [subtype] of type [Subtype] is a subtype of [Base[
Value [null] of type [Null] is NOT a subtype of [Base]

所以,在这里我们可以看到在Dart中执行此测试并不完全正确,因为null没有bottom type,而是普通类型Null的值不是{{1} }}类型,当然,不是bottom类型的子类型。

因此,我不建议在Dart中使用Base,因为将来可以将类is Null视为已弃用,并将其替换为某些内部实现的类型Null或{{1} }。