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

时间:2009-08-24 19:42:49

标签: c# refactoring coalesce null-coalescing-operator

我有一个方法会收到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);
}

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

13 个答案:

答案 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留下了比计算更多的逻辑空间,你不需要的空间。

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