我刚刚读过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。
谢谢。
答案 0 :(得分:1)
我已经使用C#很久了,据我所知,答案是否定的。
您有两个选择:
1。)使用if检查使逻辑短路,并在不需要时跳过它。平均而言,这应该是执行最快的 。
2。)使用三元运算符检查并分配一行。取决于中间编译器,这可能会稍慢一些,但是它应该是实现这种效果的最短代码(至少是可读的)。
最终,问题归结为字符串实际上是不可变的数组。如果String已经在内存中,赋值就像分配整数一样快(因为要引用现有变量,所以赋值就可以了),但是检查null和empty是至少两项检查(null检查和长度检查),这可以避免避免维护功能。三元组中的额外分配实际上是提高执行速度的唯一变量(而if版本在null时会短路)。
因此,无论如何,您都需要进行检查,并在必要时执行分配。最终,我看不出有什么方法可以避免这种情况,所以它不会比这两个用例快/短。