仅当源变量不为null时分配的最短方法

时间:2019-02-08 17:27:47

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

我刚刚读过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;

但是,人们可能会猜测这种选择并不严格等同于前一种(尽管可以观察到的结果是)。在这种情况下,我说“猜测” 是因为我不确定IL字节码是否相同。

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

谢谢。

1 个答案:

答案 0 :(得分:1)

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

您有两个选择:

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

2。)使用三元运算符检查并分配一行。取决于中间编译器,这可能会稍慢一些,但是它应该是实现这种效果的最短代码(至少是可读的)。

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

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