C# ?? 和| |操作员计时
我开始学习C语言,刚刚开始使用C# ?? 和| |操作员计时,c#,timing,null-coalescing-operator,C#,Timing,Null Coalescing Operator,我开始学习C语言,刚刚开始使用?操作符,但对时间有点困惑。以下面的代码示例为例: string x = null; string y = null; string v = null; var watch = System.Diagnostics.Stopwatch.StartNew(); if (string.IsNullOrEmpty(x ?? y ?? v ?? y ?? v)) { } watch.Stop();
?
操作符,但对时间有点困惑。以下面的代码示例为例:
string x = null;
string y = null;
string v = null;
var watch = System.Diagnostics.Stopwatch.StartNew();
if (string.IsNullOrEmpty(x ?? y ?? v ?? y ?? v))
{
}
watch.Stop();
var elapsedMs = watch.ElapsedTicks;
Console.WriteLine(elapsedMs.ToString());
watch.Restart();
if (string.IsNullOrEmpty(x) || string.IsNullOrEmpty(y) || string.IsNullOrEmpty(v) || string.IsNullOrEmpty(y) || string.IsNullOrEmpty(v))
{
}
var elapsedMs2 = watch.ElapsedTicks;
Console.WriteLine(elapsedMs2.ToString());
我得到的结果是,第一个if语句需要大约100个刻度,而第二个通常需要大约3个刻度。我的印象是,这两个语句在时间上是相似的,或者带有|
的第二个if语句将花费更长的时间
很明显,我在这里遗漏了一些东西。我认为在第一个
x
被求值为null之后,将是它,其余的将不会被求值。有人能解释我这里的错误吗?你可能有?
的定义吗<代码>a??b表示:
- 如果
为空,a
b
- 否则,
a
b
,因为我们知道a??b
是a
。如果a
像您的情况一样为空,我们必须计算b
if(string.IsNullOrEmpty(x??y??v??y??v))
运行方式为:
- 评估
x
- 其计算结果为null,因此计算
y
- 它的计算结果为null,因此计算
v
- 其计算结果为null,因此计算
y
- 它的计算结果为null,因此计算
v
- 其计算结果为null。将此值(null)传递到
字符串中。IsNullOrEmpty
- 其计算结果为
。进入区块true
if(string.IsNullOrEmpty(x)| string.IsNullOrEmpty(y)| string.IsNullOrEmpty(v)| string.IsNullOrEmpty(y)| string.IsNullOrEmpty(v))
评估为:
- 评估
x
- 其计算结果为null。将此值(null)传递到
字符串中。IsNullOrEmpty
- 其计算结果为
。由于如果只有一条边为真,则满足true
,因此我们不计算第一条|
的右侧或更右侧。进入区块|
的定义吗?
向后<代码>a??b表示:
- 如果
为空,a
b
- 否则,
a
b
,因为我们知道a??b
是a
。如果a
像您的情况一样为空,我们必须计算b
if(string.IsNullOrEmpty(x??y??v??y??v))
运行方式为:
- 评估
x
- 其计算结果为null,因此计算
y
- 它的计算结果为null,因此计算
v
- 其计算结果为null,因此计算
y
- 它的计算结果为null,因此计算
v
- 其计算结果为null。将此值(null)传递到
字符串中。IsNullOrEmpty
- 其计算结果为
。进入区块true
if(string.IsNullOrEmpty(x)| string.IsNullOrEmpty(y)| string.IsNullOrEmpty(v)| string.IsNullOrEmpty(y)| string.IsNullOrEmpty(v))
评估为:
- 评估
x
- 其计算结果为null。将此值(null)传递到
字符串中。IsNullOrEmpty
- 其计算结果为
。由于如果只有一条边为真,则满足true
,因此我们不计算第一条|
的右侧或更右侧。进入区块|