簡體   English   中英

有什么區別?? 和=?? 在 Dart?

[英]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;
  }
}

上面的代碼通過設計模式中的定義實現了 Singleton:可重用面向對象軟件的元素

兩者?? ??=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);

請參閱Dart 中的 Null-aware operators 以供參考。

??=運算符是復合賦值運算符。 就像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 ,如果不是,則返回其值。 如果_instancenull ,它還會評估ExampleStateByDefinition._internal(); 然后將其分配給_instance ,並返回值。

下次你回來時, _instance將不是null ,並且惰性緩存起作用。

基於dart 游覽

僅當對變量的賦值是 null 時才賦值,我們使用??=操作。

expr1?? expr2 expr1?? expr2如果 expr1 不是 null,返回它的值; 否則,計算並返回 expr2 的值。

原因?? 每次我們調用 object 時,操作都會評估,它會創建一個新的 object。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM