8

我的同事是 C# 新手,不知道 coalesce 运算符。于是,我看到他写了这样一行代码:

string foo = "" + str;

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

string foo = str ?? "";

而且我觉得这将更具可读性。但这真的有那么大吗?可读性的好处是否足以建议返回并使这些行看起来像第二行?或者这是我应该学会放手的事情之一(前提是我的同事受过教育,了解未来做这件事的最佳方式)?

编辑:请注意,我很欣赏效率评论,但这并没有真正用于任何性能至关重要的情况。因此,虽然这些信息很有趣,但不一定是我认为重要的信息。

4

6 回答 6

10

IMO,最好明确定义这样的逻辑,即不要使用字符串连接来避免空字符串并使用条件语句或??操作员。

关于其他评论:

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

不对。C# 编译器将 "" + string2 编译为与 string1 100% 相同的代码??“”。此外,C# 编译器将 + 运算符转换为调用 string.Concat 方法,该方法又使用 string.IsNullOrEmpty 函数检查参数,并且在这种情况下不分配新字符串。

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

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

于 2009-01-06T13:24:13.437 回答
3

我个人认为没有一个比另一个更具可读性。我更喜欢这个:

string foo = str ?? "";

只是因为我真的很喜欢??操作员。

如果您是新手,我认为这会更容易理解:

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

或者

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

但是,您需要问自己:“您真的想变得多简单?”

于 2009-01-06T13:27:32.807 回答
2

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

于 2009-01-06T13:31:43.360 回答
1

我更喜欢你的第二个例子而不是第一个例子,因为它更积极地反对str为空并且更具表现力。 此外,我建议使用String.Emptyover "",因为它是一个常数,不需要创建一个新的String(是的,这是一个极端的挑剔,但需要注意)。

于 2009-01-06T13:25:11.157 回答
1

第二行对我来说看起来更具可读性,它清楚地表明了右侧表达式的意图。

于 2009-01-06T13:25:26.663 回答
1

我会使用合并运算符或foo = str == null ? "" : str;出于两个原因:

  1. 第一个示例在其他花括号语言(尤其是 Java 和 JavaScript)中没有相同的行为,其中将空引用附加到空字符串会生成包含 text 的字符串null。因此,第一个示例需要更多的脑力劳动来确保它会在所编写的语言中产生正确的行为。即使给出其他线索,它是 C#(例如小写类型string),任何需要开发人员放慢速度并思考“这段代码的意图是什么”的东西都会导致生产力下降。当从一种语言转移到另一种语言时,它还可能引入错误。

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

    when str is null set foo to an empty string

    与第一个示例相反,可以将其解读为:

    set foo to an empty string with str appended (which may have the side effect of setting foo to an empty string when str is null)

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

于 2009-01-06T20:34:38.013 回答