题
我的同事是C#的新手,并不了解合并运营商。所以,我看到他写了一行代码:
string foo = "" + str;
这个想法是,如果str为null,则此表达式将返回一个空字符串。当然,这可以改写为:
string foo = str ?? "";
我觉得这会更具可读性。但这真的是一件大事吗?可读性的好处是否足以建议返回并使这些线看起来像第二个?或者这是我应该学会放手的事情之一(前提是我的同事接受了将来最佳方式的教育)?
编辑:请注意,我很欣赏效率评论,但这并没有真正用于任何性能至关重要的情况。因此,虽然这些信息很有趣,但并不一定是我认为重要的信息。
解决方案
关于其他意见:
还有一个性能优势 使用null-coalescing运算符, 因为不需要连接 (因此,没有额外的字符串 正在创建实例 不必要地)
不正确。 C#编译器编译“"” + string2到100%与string1相同的代码? "&QUOT ;.此外,C#编译器转换+运算符以调用string.Concat方法,该方法依次使用string.IsNullOrEmpty函数检查参数,并且在这种情况下不分配新字符串。
我还建议使用 String.Empty over“"因为它是一个 不变,不需要 创建一个新的字符串
.NET framework支持字符串实习,因此“"和string.Empty指向相同的内存区域
其他提示
我不认为一个人比另一个人更可读。我更喜欢这个:
string foo = str ?? "";
因为我真的很喜欢?操作
如果你是一个全新的品牌,我认为这会更容易理解:
string foo = str == null ? "" : str;
或
string foo = "";
if (str != null) foo = str;
然而,你需要问问自己,“你真的想要多么简单?”
虽然从技术角度来看我更喜欢第二行,但第一行实际上对我来说更具可读性......
第二行对我来说看起来更具可读性,它明确了右侧表达的意图。
我更喜欢你的第二个例子,因为它更主动地反对 str
为空并且更具表现力。 我还建议在 ""
上使用 String.Empty
,因为它是一个常量,不需要创建新的字符串
(是的,这是一个极端的挑剔,但重要的是要注意)。
我会使用coalesce运算符或 foo = str == null? "" :str;
有两个原因:
-
第一个示例在其他大括号语言(特别是Java和JavaScript)中没有相同的行为,其中对空字符串附加空引用会产生包含文本
null <的字符串代码>。因此,第一个示例需要更多的心理努力,以确保它将导致正在编写的语言中的正确行为。即使给出其他线索,它也是C#(例如小写类型
string
),任何需要开发人员减速并思考“此代码的意图是什么”的东西。导致生产力下降。从语言转向语言时,它也可能会引入错误。 -
第二个示例更清楚地表达了代码的 intent ,原始问题中描述的是:
当str为null时将foo设置为空字符串
与第一个例子相反,可以理解为:
将foo设置为附加了str的空字符串(当str为null时,可能会产生将foo设置为空字符串的副作用)
醇>
作为程序员,我们应该尝试表达代码的 intent ,而不是依赖其他操作的副作用来为我们提供我们想要的结果。
这是一篇关于string.empty vs&quot;&quot;
的文章