我有一个方法会收到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);
}
在您看来,最佳选择是什么?
答案 0 :(得分:11)
为什么不使用TryParse()
?
public int doSomeWork(string stringValue)
{
int value;
int.TryParse(stringValue, out value);
return value;
}
如果值不是实际数字,则上面的代码将返回0
。
所以在我看来,我的例子是最具可读性的。我尝试解析int并返回它。没有合并运算符,也没有使用字符串方法。此方法还处理解析时可能抛出的异常(除非您想要例外...)。
答案 1 :(得分:5)
就我个人而言,我会选择更正版本的老板 - 可能需要更多检查 - 如果字符串是空的,你的意思是,如你所说抛出异常,因为“”不是格式良好的数字, ??只检查null。
类似的东西:
public int doSomeWork(string value) {
int someValue = 0;
if (!string.IsNullOrEmpty(value)) {
Int.TryParse(value, out someValue);
}
}
这解决了价值等于“四十二”的问题。
答案 2 :(得分:3)
我认为你最好的选择是做老板所说的,这个不值得!也就是说,在你的周围添加一些空格,我更喜欢它。
int someValue = int.Parse(value ?? "0");
答案 3 :(得分:2)
我绝对更喜欢null coalesce运算符(??)而不是一系列if语句。特别是当您需要合并多个值时,运算符方法更易读。这会影响C#的其他新功能,例如lambda表达式,LINQ糖语法等。代码实际有意义的代码越少,意图就越清晰。
答案 4 :(得分:2)
为什么解析字符串“0”只是为了得到整数值0?我当然更喜欢这个:
public int doSomeWork(string value) {
int someValue;
if (String.IsNullOrEmpty(value)) {
someValue = 0;
} else {
someValue = Int32.Parse(value);
}
}
答案 5 :(得分:2)
我的重构看起来像这样
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 book on Refactoring(现在已经阅读了很长时间了)这是我通常喜欢的,我发现它也是书中常见的“模式”。
答案 6 :(得分:1)
这两个选项不相同。第二个片段中的错误的一部分(它应该是if(string.IsNullOrEmpty(value))
,它将处理两种情况,空和空字符串,而??
运算符只处理空值。
它的一部分更具可读性。我支持你的老板。
答案 7 :(得分:1)
另一种解决方案是
int someValue = string.IsNullOrEmpty(value)? 0:int.Parse(value);
答案 8 :(得分:1)
您的第一个代码段只会检查value == null
,但秒代码段会检查value == string.Empty || value == null
。我不知道你的方法的要求是什么,但这两个片段会做不同的事情。
答案 9 :(得分:1)
实际上你可以重构
var value = 0;
int.TryParse(yourString,out value);
无论哪种方式,你总是有一个有效的整数(如果这是目标)
答案 10 :(得分:0)
在这种情况下,早期的更具可读性,因为它是一个简单的例子。 **但是在你的情况下它们并不等同,因为??与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;
}
答案 11 :(得分:0)
你可以按照自己的方式去做吗?酷!
如果肯定更具可读性,除非每个人都比我更喜欢C#。
答案 12 :(得分:0)
[假设你只需要检查null,而不是空字符串,正如其他人指出的那样]
两者之间的语义差异是??
是一个表达式,而if
是一个语句。表达式表示“执行计算并返回结果”,正是您所寻求的语义。必须做更多的工作才能使if
语句表达相同的语义;除此之外,if
留下了比计算更多的逻辑空间,你不需要的空间。
您应该使用??
运算符,因为它完全表达了所需的意图。