【问题标题】:Shortest way of assigning only if source variable is not null仅当源变量不为空时分配的最短方法
【发布时间】:2019-07-02 23:52:36
【问题描述】:

我刚刚看了Shortest way to check for null and assign another value if not,但还有一个问题。

考虑一下这个常见的代码模式:

if ( !string.IsNullOrEmpty(source) )
    dest = source;

可以使用null-coalescing operator

将其表达为单行
dest = source ?? dest;

[编辑:] 感谢@Rango 意识到这些是不等价的。但以下肯定是:

dest = !string.IsNullOrEmpty(source) ? source : dest;

但是,有人会猜测这种替代方案并不严格等同于前者(尽管可观察到的结果是)。我在这种情况下说 "guess" 是因为我不确定 IL 字节码是否相同。

在任何一种情况下,在source 为空的情况下,是否有任何更短的方法将任何内容(甚至不是原始值)分配给变量dest?即使是使用按位运算符或更聪明的技巧。我实际上希望有一种类似于null-conditional operator 的语法。

谢谢。

【问题讨论】:

  • 怎么会一样呢?前者还会检查它是否为空字符串
  • “使用按位运算符”你更喜欢它而不是可读的if?
  • @Marc.2377:不是在 IL 方面,而是在效果方面。 source ?? dest 只会读取一次 source。第一个版本没有。想象一下,如果source 在第一次读取时为非空且非空,但在第二次读取之前在另一个线程中变为空(并且如果实际执行该读取 - 内存模型很难),dest 将结束为空。
  • 正是如此。两次读取这样的局部变量将(几乎总是)两次给您相同的结果。 (ref 参数会改变这一点,但是...)

标签: c# .net variable-assignment c#-6.0


【解决方案1】:

我已经使用 C# 很长时间了,据我所知,答案是否定的。

您有两个选择:

1.) 使用 if 检查来短路逻辑并在不需要时跳过它。平均而言,这应该是最快执行的。

2.) 使用三元运算符在一行中进行检查和赋值。取决于中间编译器,这可能会慢一点,但它应该是实现此效果的最短代码(至少可读)。

最终,问题归结为字符串实际上是不可变数组。如果字符串已经在内存中(因为它会因为您正在引用现有变量),则分配与分配整数一样快,但是检查 null 和 empty 至少是两个检查(null 检查和长度检查),它可以不能避免维护功能。三元中的额外赋值实际上是执行速度的唯一变量(而 if 版本在 null 时会短路)。

因此,无论如何,您都需要进行检查,并在必要时执行分配。最终,我看不出有任何方法可以避免这种情况,因此它不会比这两个用例更快/更短。

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2011-12-07
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多