??
运算符在 C# 中计算时是否使用短路运算?
var result = myObject ?? ExpressionWithSideEffects();
当
myObject
不为null时,ExpressionWithSideEffects()
的结果不会被使用,但是ExpressionWithSideEffects()
会完全被跳过吗???
运算符在 C# 中计算时是否使用短路运算?
var result = myObject ?? ExpressionWithSideEffects();
myObject
不为null时,ExpressionWithSideEffects()
的结果不会被使用,但是ExpressionWithSideEffects()
会完全被跳过吗?是的,它会短路。
这里有一段代码片段可以在 LinqPad 中测试:
string bar = "lol";
string foo = bar ?? string.Format("{2}", 1);
foo.Dump();
bar = null;
foo = bar ?? string.Format("{2}", 1);
foo.Dump();
第一个 coalesce 在不抛出异常的情况下工作,而第二个则会抛出异常(格式字符串无效)。
[TestMethod]
public void ShortCircuitNullCoalesceTest()
{
const string foo = "foo";
var result = foo ?? Bar();
Assert.AreEqual(result, foo);
}
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void ShortCircuitNullCoalesceFails()
{
const string foo = null;
var result = foo ?? Bar();
}
private static string Bar()
{
throw new ArgumentException("Bar was called");
}
这些不是最好的测试名称,但你可以理解它。它展示了空合并运算符按预期短路的情况。