[英]What is the difference between ?? and =?? in Dart?
在下面实现 Singleton 设计模式的代码中,我们采用了两种不同的方法。 其中一个创建Singleton
,而另一个在我们每次调用它时创建一个 object。 有什么区别??
和=??
在下面的代码中写成 dart?
class ExampleStateByDefinition extends ExampleStateBase {
static ExampleStateByDefinition? _instance;
ExampleStateByDefinition._internal() {
initialText = 'A new "ExampleStateByDefinition" instance has been created.';
stateText = initialText;
print(stateText);
}
static ExampleStateByDefinition? getState() {
return _instance ?? ExampleStateByDefinition._internal(); //here we use ??
}
}
上面的代码在我们每次调用它时都会创建一个 object,所以让我们看看另一个变体:
class ExampleStateByDefinition extends ExampleStateBase {
static ExampleStateByDefinition? _instance;
ExampleStateByDefinition._internal() {
initialText = 'A new "ExampleStateByDefinition" instance has been created.';
stateText = initialText;
print(stateText);
}
static ExampleStateByDefinition? getState() {
_instance ??= ExampleStateByDefinition._internal(); //Here we use ??=
return _instance;
}
}
两者??
和??=
是null-aware operators 。
这两个运算符的区别在于前者只对表达式求值,而后者还对表达式的结果进行赋值。
这就是为什么您的第一个示例每次都返回一个新实例,因为您从未将它分配给 static 变量。
??
利用?? 当你想计算并返回一个表达式时,IFF 另一个表达式解析为 null。
以下表达式:
exp ?? otherExp;
类似于这个表达式:
((x) => x == null ? otherExp : x)(exp);
??=
当你想给 object IFF 赋值时使用 ??= object 是 null。否则,返回 object。
以下表达式:
obj ??= value;
类似于这个表达式:
((x) => x == null ? obj = value : x)(obj);
??=
运算符是复合赋值运算符。 就像target += 1
等价于target = target + 1
(但target
只计算一次,如果它是一个复杂的表达式), target??= expression
等价于target = target?? expression
target = target?? expression
(但target
只评估一次,如果target
不是null
则赋值甚至不会发生)。
所以,不同之处在于第一个代码可能不起作用,而第二个代码可以。
代码:
return _instance ?? ExampleStateByDefinition._internal();
检查_instance
是否为非null
,如果是,则返回_instance
的值。 如果是null
,它会计算并返回ExampleStateByDefinition._internal()
。 它没有分配给_instance
的地方。 因此, _instance
始终为null
,代码可能无法执行其预期的操作——缓存一个值。
代码:
_instance ??= ExampleStateByDefinition._internal();
return _instance;
或其更精简的版本:
return _instance ??= ExampleStateByDefinition._internal();
还将检查_instance
是否为null
,如果不是,则返回其值。 如果_instance
是null
,它还会评估ExampleStateByDefinition._internal();
,然后将其分配给_instance
,并返回值。
下次你回来时, _instance
将不是null
,并且惰性缓存起作用。
基于dart 游览。
仅当对变量的赋值是 null 时才赋值,我们使用??=
操作。
expr1?? expr2
expr1?? expr2
如果 expr1 不是 null,返回它的值; 否则,计算并返回 expr2 的值。
原因??
每次我们调用 object 时,操作都会评估,它会创建一个新的 object。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.