【问题标题】:?? and || Operator timing??和 ||操作员计时
【发布时间】:2020-04-09 13:53:12
【问题描述】:

我开始学习 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 之后就可以了,其余的都不会被评估。有人能解释我在这里做错了什么吗?

【问题讨论】:

    标签: c# timing null-coalescing-operator


    【解决方案1】:

    你可能有 ?? 的定义倒退吗? a ?? b 表示:

    • 如果a 为空,b
    • 否则,a

    所以如果左边是not null,那么我们不评估b,因为我们知道a ?? ba。如果a null,就像您的情况一样,我们确实必须评估b

    if (string.IsNullOrEmpty(x ?? y ?? v ?? y ?? v))

    运行方式:

    • 评估x
    • 计算结果为 null,因此计算 y
    • 计算结果为 null,因此计算 v
    • 计算结果为 null,因此计算 y
    • 计算结果为 null,因此计算 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。因为如果只有一个边为真,|| 就满足了,所以我们不评估第一个 || 的右侧,或任何更靠右的部分。进入区块。

    【讨论】:

    • 啊,好的,谢谢!在开始测试时间之前,我应该更专注于了解操作员的实际操作。
    猜你喜欢
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    相关资源
    最近更新 更多