合并vs空字符串连接

时间:2009-01-06 13:18:53

标签: c# string concatenation coalesce

我的同事是C#的新手,并不了解合并运营商。所以,我看到他写了一行代码:

string foo = "" + str;

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

string foo = str ?? "";

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

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

7 个答案:

答案 0 :(得分:10)

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

关于其他意见:

  

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

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

  

我还建议使用   String.Empty over“”,因为它是一个   不变,不需要   创建一个新的字符串

.NET框架支持string interning所以“”和string.Empty指向相同的内存区域

答案 1 :(得分:3)

我不认为一个人比另一个人更可读。我更喜欢这个:

string foo = str ?? "";

因为我真的很喜欢?操作

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

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

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

然而,你需要问自己,“你真的想要多么简单?”

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

我使用coalesce运算符或foo = str == null ? "" : str;有两个原因:

  1. 第一个示例在其他大括号语言(特别是Java和JavaScript)中没有相同的行为,其中对空字符串附加空引用会产生包含文本null的字符串。因此,第一个示例需要更多的心理努力,以确保它将导致正在编写的语言中的正确行为。即使给出了其他线索,它也是C#(例如小写类型string),任何需要开发人员减速并认为“此代码的意图是什么”的内容都会导致生产力下降。从语言转向语言时,它也可能会引入错误。

  2. 第二个示例更清楚地表达了代码的 intent ,原始问题中描述的是:

    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)

  3. 作为程序员,我们应该尝试表达代码的 intent ,而不是依赖其他操作的副作用来为我们提供我们想要的结果。

答案 6 :(得分:0)

这是一篇关于string.empty vs“”

的文章

http://blogs.msdn.com/brada/archive/2003/04/22/49997.aspx