null合并运算符是否将结果缓存在c#中

我知道做(myValue ?? new SomeClass())类似于(myValue == null ? new SomeClass() : myValue)

但出于好奇,当我调用一个函数时,是否有任何性能优势,比如说(getResult() ?? new SomeClass())getResult()会被执行两次吗? 这似乎不直观,因为我只指定了一次方法调用。

好吧,如果通过“缓存”意味着将其存储在临时变量中,那么是的。

这个结构:

 var result = (getResult() ?? new SomeClass()); 

可以被认为是等同于:

 var  = getResult(); if ( == null)  = new SomeClass(); result = ; 

这也告诉你第二部分,后面的操作数?? 如果第一个操作数不为null则根本不执行。

那么回答你的具体问题:

  1. 每个操作数最多评估一次
  2. 仅当第一个操作数的计算结果为null才会计算第二个操作数

另请注意,您可以链接这些:

 var result = first() ?? second() ?? third() ?? fourth(); 

结果如下:

  1. first()评估first()
  2. 如果first()计算为null ,则计算second()
  3. 如果second()评估为null ,则计算third()
  4. 如果以上所有评估为null ,则最终评估fourth

结果是返回的第一个(无双关语)非空值。


这种类型的代码即将在使用新的C#的新C#中变得更好?. 运营商:

 var result = first?.second?.third; 

这是基本的. 处理,即。 它将读取第一个的second成员,然后是third成员,但它将在第一个null处停止,并且还将确保仅评估每个步骤一次:

 (obj as IDisposable)?.Dispose(); 

obj as IDisposable只会评估一次。

 TryGetObjectToSave()?.Save(); 

只调用一次TryGetObjectToSave() ,如果它返回一些东西,将调用该东西的Save()方法。