仅当源变量不为空时分配的最短方法
Shortest way of assigning only if source variable is not null
我刚读完 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 字节码是否相同。
在任何一种情况下,在 [=14] 的情况下,是否有更短的方法 not 将任何东西(甚至不是原始值)分配给变量 dest
=] 为空?即使使用按位运算符或更聪明的技巧。我实际上希望使用类似于 null-conditional operator.
的语法
谢谢。
我已经使用 C# 很长时间了,据我所知,答案是否定的。
您有两个选择:
1.) 使用 if 检查来短路逻辑并在不需要时跳过它。这应该是 最快 平均执行。
2.) 使用三元运算符在一行中进行检查和赋值。根据中间编译器的不同,这可能会稍微慢一点,但它应该是实现这种效果的最短代码(至少是可读的)。
最终,问题归结为字符串实际上是不可变数组。如果 String 已经在内存中,则赋值与分配整数一样快(就像您引用现有变量一样),但是检查 null 和 empty 至少是两次检查(null 检查和长度检查)可以' 避免维护功能。三元中的额外赋值实际上是执行速度的唯一变量(而 if 版本在 null 时将其短路)。
因此,无论如何,您都需要进行检查,并在必要时执行作业。最终,我看不出有什么方法可以避免这种情况,所以除了这两个用例,它无法得到任何 faster/shorter。
我刚读完 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 字节码是否相同。
在任何一种情况下,在 [=14] 的情况下,是否有更短的方法 not 将任何东西(甚至不是原始值)分配给变量 dest
=] 为空?即使使用按位运算符或更聪明的技巧。我实际上希望使用类似于 null-conditional operator.
谢谢。
我已经使用 C# 很长时间了,据我所知,答案是否定的。
您有两个选择:
1.) 使用 if 检查来短路逻辑并在不需要时跳过它。这应该是 最快 平均执行。
2.) 使用三元运算符在一行中进行检查和赋值。根据中间编译器的不同,这可能会稍微慢一点,但它应该是实现这种效果的最短代码(至少是可读的)。
最终,问题归结为字符串实际上是不可变数组。如果 String 已经在内存中,则赋值与分配整数一样快(就像您引用现有变量一样),但是检查 null 和 empty 至少是两次检查(null 检查和长度检查)可以' 避免维护功能。三元中的额外赋值实际上是执行速度的唯一变量(而 if 版本在 null 时将其短路)。
因此,无论如何,您都需要进行检查,并在必要时执行作业。最终,我看不出有什么方法可以避免这种情况,所以除了这两个用例,它无法得到任何 faster/shorter。