[英]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.