在Dart中,检查值为== null
似乎与检查is Null
类似。为什么前者更可取?
答案 0 :(得分:6)
这是您正在进行的比较类型。在== null
中,您将对象/原型与null
进行比较,而在后者中,is Null
,null
是一个对象。它在编译器中没有任何区别。
== 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} }。