合并 vs 空字符串拼接

8

我的同事刚开始学习C#,不知道如何使用null合并运算符。所以,我看到他写了一行代码:

string foo = "" + str;

这个想法是,如果str为null,那么这个表达式将返回一个空字符串。当然,这也可以重写为:

string foo = str ?? "";

我认为这样会更易读。但这真的那么重要吗?阅读性的好处足以建议回去将那些行看起来像第二个吗?还是这是我应该学会放手的事情(前提是我的同事了解未来最佳做法)?
注:我很感激效率的评论,但这并没有在任何需要关注性能的情况下使用。因此,虽然这些信息很有趣,但并不一定是我认为重要的。
6个回答

10

在我看来,更好的做法是明确定义这样的逻辑,即不使用字符串连接来避免空字符串,并使用条件语句或 ?? 操作符。

关于其他评论:

使用 null 合并运算符也有性能优势, 因为不需要进行连接(因此不会不必要地创建额外的字符串实例)

这不是真的。C#编译器将 "" + string2 编译成与 string1 ?? "" 完全相同的代码。此外,C#编译器将+运算符转换为调用 string.Concat 方法,该方法反过来使用 string.IsNullOrEmpty 函数检查参数,在这种情况下不会分配新字符串。

此外,我建议使用 String.Empty 而不是 "",因为它是一个常量,不需要创建新的 String

.NET框架支持字符串池,因此 "" 和 string.Empty 指向同一内存区域。


3

我个人认为两者的可读性并没有显著区别,但我更喜欢这种写法:

string foo = str ?? "";

仅仅因为我非常喜欢 ?? 操作符。

如果你是一个全新的开发者,我认为这会更容易理解:

string foo = str == null ? "" : str;

或者

string foo = "";
if (str != null) foo = str;

然而,你需要问自己,“你真的想要多简单?”这取决于你对技术的需求和理解程度。

2

虽然从技术角度来看,我更喜欢第二行,但实际上第一行对我来说更易读...


1
我更喜欢你的第二个例子,因为它更积极地防止str为空,并且更具表现力。此外,我建议使用String.Empty而不是"",因为它是一个常量,不需要创建新的String(是的,这是一个极端的小问题,但很重要)。

"" 和 String.Empty 在 .NET 2.0 及以后版本是相同的(.NET FW 支持字符串驻留),即不会创建字符串类的新实例。 - aku
String.Empty更易读,看起来也不像有人忘记输入什么了。 - Oliver Friedrich
我同意 - 我明确更喜欢String.Empty的外观,但是 aku 在指出没有性能优势方面是100%正确的。 - Andrew Hare
我更喜欢 "",因为它更短。此外,我读到了一些关于 String.Empty 是只读的,并且会导致某些字符串连接在运行时而不是编译时发生的内容。 - Greg

1

对我来说,第二行更易读,它清晰地表达了右侧表达式的意图。


1

我会使用合并运算符或foo = str == null ? "" : str;,原因如下:

  1. 第一个示例在其他花括号语言(特别是Java和JavaScript)中没有相同的行为,将空引用附加到空字符串会导致包含文本null的字符串。因此,在编写语言时,第一个示例需要更多的思维努力来确保它会产生正确的行为。即使给出了其他提示,它是C#(例如小写类型string),任何需要开发人员放慢速度并思考“此代码的意图是什么”的事情都会导致失去生产力。这也可能在从一种语言移动到另一种语言时引入错误。

  2. 第二个示例更清楚地表达了代码的意图,正如原始问题所描述的:

    当str为空时将foo设置为空字符串

    与第一个示例不同,它可以被阅读为:

    将带有str的空字符串设置为foo(当str为空时可能具有设置foo为空字符串的副作用)

作为程序员,我们应该尽可能地表达代码的意图,而不是依赖其他操作的副作用来得到我们想要的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接