和有什么区别??和=??在飞镖?
What is the difference between ?? and =?? in Dart?
在下面实现单例设计模式的代码中,我们采用了两种不同的方法。
其中一个创建 Singleton
但另一个在我们每次调用它时创建一个对象。
下面用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 ??
}
}
上面的代码每次调用都会创建一个对象,所以让我们看看另一种变体:
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;
}
}
以上代码在Design Patterns: Elements of Reusable Object-Oriented Software
中通过定义实现了Singleton
基于dart tour.
要仅在对变量的赋值为空时才赋值,我们使用??=
操作。
expr1 ?? expr2
如果 expr1 不为空,return 它的值;否则, 计算 和 return expr2 的值。
原因??
每次我们调用对象时,操作都会评估,它会创建一个新对象。
??
和??=
都是null-aware运算符.
差异
这两个运算符的区别在于前者只计算一个表达式,而后者还赋值表达式的结果。
这就是为什么您的第一个示例每次 returns 一个新实例,因为您从未 将它分配 给您的静态变量。
??
Use ?? when you want to evaluate and return an expression IFF another expression resolves to null.
下面的表达式:
exp ?? otherExp;
类似于这个表达式:
((x) => x == null ? otherExp : x)(exp);
??=
Use ??= when you want to assign a value to an object IFF that object is null. Otherwise, return the object.
下面的表达式:
obj ??= value;
类似于这个表达式:
((x) => x == null ? obj = value : x)(obj);
??=
运算符是复合赋值运算符。
就像 target += 1
等同于 target = target + 1
(但如果 target
是一个复杂的表达式,则只计算一次),
target ??= expression
等同于 target = target ?? expression
(但是 target
只计算一次 和 如果 target
是非 null
).
因此,不同之处在于第一个代码可能不起作用,而第二个可能起作用。
代码:
return _instance ?? ExampleStateByDefinition._internal();
检查_instance
是否为非null
,如果是,则return为_instance
的值。如果是 null
,则求值 returns ExampleStateByDefinition._internal()
。
No-where 它分配给 _instance
. 所以,_instance
总是 null
,代码可能是未能按预期执行 — 缓存值。
代码:
_instance ??= ExampleStateByDefinition._internal();
return _instance;
或其更精简的版本:
return _instance ??= ExampleStateByDefinition._internal();
还将检查 _instance
是否为 null
,如果不是,则 return 其值。
如果 _instance
是 null
,它还会评估 ExampleStateByDefinition._internal();
,然后 然后将其分配给 _instance
,然后 return s 值。
下次再来,_instance
非null
,惰性缓存起作用。
在下面实现单例设计模式的代码中,我们采用了两种不同的方法。
其中一个创建 Singleton
但另一个在我们每次调用它时创建一个对象。
下面用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 ??
}
}
上面的代码每次调用都会创建一个对象,所以让我们看看另一种变体:
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;
}
}
以上代码在Design Patterns: Elements of Reusable Object-Oriented Software
中通过定义实现了Singleton基于dart tour.
要仅在对变量的赋值为空时才赋值,我们使用??=
操作。
expr1 ?? expr2
如果 expr1 不为空,return 它的值;否则, 计算 和 return expr2 的值。
原因??
每次我们调用对象时,操作都会评估,它会创建一个新对象。
??
和??=
都是null-aware运算符.
差异
这两个运算符的区别在于前者只计算一个表达式,而后者还赋值表达式的结果。
这就是为什么您的第一个示例每次 returns 一个新实例,因为您从未 将它分配 给您的静态变量。
??
Use ?? when you want to evaluate and return an expression IFF another expression resolves to null.
下面的表达式:
exp ?? otherExp;
类似于这个表达式:
((x) => x == null ? otherExp : x)(exp);
??=
Use ??= when you want to assign a value to an object IFF that object is null. Otherwise, return the object.
下面的表达式:
obj ??= value;
类似于这个表达式:
((x) => x == null ? obj = value : x)(obj);
??=
运算符是复合赋值运算符。
就像 target += 1
等同于 target = target + 1
(但如果 target
是一个复杂的表达式,则只计算一次),
target ??= expression
等同于 target = target ?? expression
(但是 target
只计算一次 和 如果 target
是非 null
).
因此,不同之处在于第一个代码可能不起作用,而第二个可能起作用。
代码:
return _instance ?? ExampleStateByDefinition._internal();
检查_instance
是否为非null
,如果是,则return为_instance
的值。如果是 null
,则求值 returns ExampleStateByDefinition._internal()
。
No-where 它分配给 _instance
. 所以,_instance
总是 null
,代码可能是未能按预期执行 — 缓存值。
代码:
_instance ??= ExampleStateByDefinition._internal();
return _instance;
或其更精简的版本:
return _instance ??= ExampleStateByDefinition._internal();
还将检查 _instance
是否为 null
,如果不是,则 return 其值。
如果 _instance
是 null
,它还会评估 ExampleStateByDefinition._internal();
,然后 然后将其分配给 _instance
,然后 return s 值。
下次再来,_instance
非null
,惰性缓存起作用。