??和||操作员计时
?? and || Operator timing
我正在开始学习 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();
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
所以如果左侧 不是 null,那么我们不评估 b
,因为我们知道 a ?? b
是 a
.如果 a
是 null,就像你的情况一样,我们 do 必须评估 b
.
if (string.IsNullOrEmpty(x ?? y ?? v ?? y ?? v))
运行为:
- 评价
x
.
- 评估为空,因此评估
y
。
- 计算为空,因此计算
v
。
- 评估为空,因此评估
y
。
- 计算为空,因此计算
v
。
- 评估为空。将此值 (null) 传递到
string.IsNullOrEmpty
.
- 计算结果为
true
。进入方块。
if (string.IsNullOrEmpty(x) || string.IsNullOrEmpty(y) || string.IsNullOrEmpty(v) || string.IsNullOrEmpty(y) || string.IsNullOrEmpty(v))
评估为:
- 评价
x
.
- 评估为空。将此值 (null) 传递到
string.IsNullOrEmpty
.
- 计算结果为
true
。由于如果只有一个边为真,||
就满足了,我们不计算第一个 ||
的右边,或者更右边的任何边。进入方块。
我正在开始学习 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();
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
所以如果左侧 不是 null,那么我们不评估 b
,因为我们知道 a ?? b
是 a
.如果 a
是 null,就像你的情况一样,我们 do 必须评估 b
.
if (string.IsNullOrEmpty(x ?? y ?? v ?? y ?? v))
运行为:
- 评价
x
. - 评估为空,因此评估
y
。 - 计算为空,因此计算
v
。 - 评估为空,因此评估
y
。 - 计算为空,因此计算
v
。 - 评估为空。将此值 (null) 传递到
string.IsNullOrEmpty
. - 计算结果为
true
。进入方块。
if (string.IsNullOrEmpty(x) || string.IsNullOrEmpty(y) || string.IsNullOrEmpty(v) || string.IsNullOrEmpty(y) || string.IsNullOrEmpty(v))
评估为:
- 评价
x
. - 评估为空。将此值 (null) 传递到
string.IsNullOrEmpty
. - 计算结果为
true
。由于如果只有一个边为真,||
就满足了,我们不计算第一个||
的右边,或者更右边的任何边。进入方块。