在您看来,什么更具可读性? (运营商)或使用if

我有一个接收string的方法,但在我使用它之前,我必须将它转换为int 。 有时它可以为null ,我必须将其值更改为"0" 。 今天我有:

 public void doSomeWork(string value) { int SomeValue = int.Parse(value ?? "0"); //it can throw an exception(i know) } 

我做到了,但我的老板让我重构它:

 public void doSomeWork(string value) { if(string.IsNullOrEmpty(value)) value = "0"; int SomeValue = int.Parse(value); } 

在您看来,什么是最好的选择?

就个人而言,我会去找你老板的更正版本 – 可能会对它进行更多检查 – 如果字符串是空的,你的意思是,如你所说抛出exception,因为“”不是格式良好的数字而且? 只检查null。

就像是:

 public int doSomeWork(string value) { int someValue = 0; if (!string.IsNullOrEmpty(value)) { Int.TryParse(value, out someValue); } } 

这解决了价值等于“四十二”的问题。

为什么不使用TryParse()

 public int doSomeWork(string stringValue) { int value; int.TryParse(stringValue, out value); return value; } 

如果值不是实际数字,则上面的代码将返回0

所以在我看来,我的例子是最具可读性的。 我尝试解析int并返回它。 没有合并运算符,也没有使用字符串方法。 此方法还处理解析时可能抛出的exception(除非您想要例外…)。

我认为你最好的选择是做老板所说的,这个不值得! 也就是说,在你的周围增加一些空间,我更喜欢它。

 int someValue = int.Parse(value ?? "0"); 

我肯定更喜欢null coalesce运算符(??)而不是一系列if语句。 特别是当您需要合并多个值时,运算符方法更易读。 这会影响C#的其他新function,例如lambda表达式,LINQ糖语法等。使实际有意代码混淆的代码越少,意图应该/将会更清晰。

为什么解析字符串“0”只是为了得到整数值0? 我绝对喜欢这个:

 public int doSomeWork(string value) { int someValue; if (String.IsNullOrEmpty(value)) { someValue = 0; } else { someValue = Int32.Parse(value); } } 

我的重构看起来像这样

 public int doSomeWork(string value) { int result = 0; //default? if(string.IsNullOrEmpty(value)) { result = 0; } else { result = int.Parse(value); //you could also consider using TryParse(...) if your string could possibly also be different from a number. } //do some calculations upon "result" return result; } 

我现在正在阅读Martin Fowlers关于重构的书 (希望现在已经阅读了很长时间),这是我通常喜欢的,我发现它也是书中常见的“模式”。

这两个选项不相同。 来自第二个片段中的错误的一部分(它应该读取if(string.IsNullOrEmpty(value)) ,它将处理两种情况,null和空字符串,而??运算符只处理空值。

它的一部分更具可读性。 我支持你的老板。

另一个解决方案是

int someValue = string.IsNullOrEmpty(value)? 0:int.Parse(value);

您的第一个代码段只会检查value == null ,但是秒代码片段会检查value == string.Empty || value == null value == string.Empty || value == null 。 我不知道你的方法的要求是什么,但这两个片段将做不同的事情。

实际上你可以重构

var值= 0;
int.TryParse(yourString,out value);

无论哪种方式,你总是有一个有效的整数(如果这是目标)

你可以按照自己的方式去做吗? 凉!

如果肯定更具可读性,除非每个人都比我更喜欢C#。

在这种情况下,早期更易读,因为它是一个简单的例子。 **但是在你的情况下它们并不等同,因为?? 与string.IsNullOrEmpty不同**

如果if很复杂,后者会更好。 我会说马匹课程。 只取决于观众。 尽量保持简单。

 public int doSomeWork(string value) { return int.Parse(value ?? "0"); } public int doSomeWork(string value) { if(value == null) value = "0"; int SomeValue = int.Parse(value); return SomeValue; } 

[假设你只需要检查null,而不是空字符串,正如其他人指出的那样]

两者之间的语义差异是?? 是一个表达式,而if是一个语句。 表达式表示“执行计算并返回结果”,正是您所寻求的语义。 必须做更多的工作才能使if语句表达相同的语义; 除此之外, if留下比计算更多的逻辑空间,你不需要的空间。

你应该使用?? 运算符,因为它完全表达了所需的意图。