和有什么区别??和=??在飞镖?

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);

参考Null-aware operators in Dart

??= 运算符是复合赋值运算符。 就像 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 其值。 如果 _instancenull,它还会评估 ExampleStateByDefinition._internal();,然后 然后将其分配给 _instance,然后 return s 值。

下次再来,_instancenull,惰性缓存起作用。