??和||操作员计时

?? 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 ?? ba .如果 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。由于如果只有一个边为真,|| 就满足了,我们不计算第一个 || 的右边,或者更右边的任何边。进入方块。