我的同事是C#的新手,并不了解合并运营商。所以,我看到他写了一行代码:
string foo = "" + str;
这个想法是,如果str为null,则此表达式将返回一个空字符串。当然,这可以改写为:
string foo = str ?? "";
我觉得这会更具可读性。但这真的是一件大事吗?可读性的好处是否足以建议返回并使这些线看起来像第二个?或者这是我应该学会放手的事情之一(前提是我的同事接受了将来最佳方式的教育)?
编辑:请注意,我很欣赏效率评论,但这并不是在任何表现性能至关重要的情况下使用。因此,虽然这些信息很有趣,但并不一定是我认为重要的信息。
答案 0 :(得分:10)
关于其他意见:
还有一个性能优势 使用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;
有两个原因:
第一个示例在其他大括号语言(特别是Java和JavaScript)中没有相同的行为,其中对空字符串附加空引用会产生包含文本null
的字符串。因此,第一个示例需要更多的心理努力,以确保它将导致正在编写的语言中的正确行为。即使给出了其他线索,它也是C#(例如小写类型string
),任何需要开发人员减速并认为“此代码的意图是什么”的内容都会导致生产力下降。从语言转向语言时,它也可能会引入错误。
第二个示例更清楚地表达了代码的 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)
作为程序员,我们应该尝试表达代码的 intent ,而不是依赖其他操作的副作用来为我们提供我们想要的结果。
答案 6 :(得分:0)
这是一篇关于string.empty vs“”
的文章