繁体   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