在我的理解中,null对象是没有引用值的对象?就像一个不存在的盒子,并且该对象上的任何函数都是不可访问的。
现在,在Null安全中,更具体地说,Dart,您可以访问Null对象上的函数(在扩展中(并获得结果,而不必像?
或!
那样进行Null检查
void main() {
String? a;
String b;
a = "a";
b = "b";
print(a.test2);
a = null;
print(a.test2);// Here we don't need to do null checks on this object but we can still safely access "test2"
print(b.test2);
}
extension Test on String? { // Notice: The extension is on a nullable String
String get test2 => "$this test";
}
我对空对象的理解是null和void(双关语(,还是我对null对象的理解中缺少了一些东西?
你可以戴着这个玩https://dartpad.dev/?id=c655e00920d2078654a9277287e3e450
一个变量如果没有实际指向其类型的实例,则为null。
您不能对null值执行任何操作,只能检查它是否为null。
您的扩展是有效的,因为它只是一个语法糖,用于将此变量作为第一个参数的正常函数。Dart把这个事实隐藏得有点太好了,其他语言让它更清楚地表明了引擎盖下到底发生了什么。
所以你写的扩展基本上是一个静态方法,说";如果你给我传递一个可以为null的字符串,我将返回一个常量"。是的,这是可能的。解释起来有点混乱,所以让我用一个普通的方法而不是getter来解释:
extension Test on String? { // Notice: The extension is on a nullable String
String test2() { return "$this test"; }
}
这并不是什么新鲜事。你本可以写:
String test2(String? value) { return "$value test"; }
这样做的原因很清楚:您根本不会访问value
。扩展不是魔法。这只是你的编译器的说法:你知道吗?一直调用test2(a);
看起来真的很不酷,而且很难自动完成,所以让我来帮助你。如果你称之为";"扩展";,我允许你这样称呼它:a.test2();
。从字面上看,这是不同顺序的相同字符。这就是所有的";扩展";dos:它允许您使用与类方法相同的语法来调用该方法,而不是使用值作为第一个参数的自由函数。
因此,是的,您可以将可为null的变量传递给接受可为null参数的方法在该方法内部,如果您想对该变量执行任何操作,则必须再次执行null检查。