【发布时间】:2019-07-02 23:52:36
【问题描述】:
我刚刚看了Shortest way to check for null and assign another value if not,但还有一个问题。
考虑一下这个常见的代码模式:
if ( !string.IsNullOrEmpty(source) )
dest = source;
将其表达为单行
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