【发布时间】:2014-11-19 09:14:41
【问题描述】:
我正在考虑在 C# 中使用 ?? 运算符(null-coalescing 运算符)。但是 MSDN 上的documentation 是有限的。
我的问题:如果左边的操作数不为空,右边的操作数会被计算吗?
【问题讨论】:
-
自己试试吧:
string s = "A"; Console.WriteLine("Hello" ?? a.Substring(10));
我正在考虑在 C# 中使用 ?? 运算符(null-coalescing 运算符)。但是 MSDN 上的documentation 是有限的。
我的问题:如果左边的操作数不为空,右边的操作数会被计算吗?
【问题讨论】:
string s = "A"; Console.WriteLine("Hello" ?? a.Substring(10));
与以往一样,C# 规范是此类事情的最佳选择。
来自C# 5 specification(强调我的)的第 7.13 节:
a ?? b形式的空合并表达式要求a为可空类型或引用类型。如果a不为null,则a ?? b的结果为a;否则,结果为b。 仅当a为空时,该操作才会评估b。
关于何时执行任何转换以及确切的行为有更多详细信息,但这是您提出问题的重点。还值得注意的是,空合并运算符是右关联的,所以 a ?? b ?? c 被评估为 a ?? (b ?? c)... 这意味着它只会评估 c 如果 both a 和b 为空。
【讨论】:
(a ?? b) ?? c 的行为与a ?? (b ?? c) 不同的情况,但我想不出一个。
a、b 和c 具有不同的类型,并且该语言最终执行从一种类型到另一种类型的转换,则会产生影响。我曾经有一个例子,但我没有现成的。
来自规范:
a ?? 形式的空合并表达式b 要求 a 是可空类型或引用类型。如果 a 不为空,则 a ?? 的结果b是a;否则,结果为 b。 仅当 a 为空时,该操作才计算 b。
(已添加重点)
【讨论】:
看看这个。如果 name 不为 null,则控制台显示“MyName”。如果为空,控制台显示“Called”,然后显示“Allo”
using System;
public class Program
{
public static void Main()
{
string name = "MyName";
Console.WriteLine(name??test());
}
private static string test()
{
Console.WriteLine("Called");
return "Allo";
}
}
【讨论】:
为什么不测试它:)
void Main()
{
var leftOrRight = left ?? right;
}
public bool? left
{
get
{
Console.WriteLine ("Left hit");
return true;
}
}
public bool right
{
get
{
Console.WriteLine ("Right hit");
return true;
}
}
问题的答案是no...第二个值没有得到评估
【讨论】: