3

我有一个可以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);
}

您认为最好的选择是什么?

4

13 回答 13

11

为什么不直接使用TryParse()

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

    return value;
}

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

所以在我看来,我的例子是最易读的。我尝试解析 int 并返回它。没有合并运算符,也没有使用字符串方法。此方法还处理解析时可能引发的异常(除非您想要异常......)。

于 2009-08-24T19:56:07.137 回答
5

就我个人而言,我会选择你的老板的更正版本 - 可能会对其进行更多检查 - 如果字符串为空,你的会,正如你所说的抛出异常,因为 "" 不是一个格式正确的数字和 ?? 只检查空值。

就像是:

public int doSomeWork(string value) {
  int someValue = 0;

  if (!string.IsNullOrEmpty(value)) {
    Int.TryParse(value, out someValue);
  }
}

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

于 2009-08-24T19:50:15.697 回答
3

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

int someValue = int.Parse(value ?? "0");
于 2009-08-24T19:44:59.750 回答
2

与一系列 if 语句相比,我绝对更喜欢空合并运算符 (??)。特别是当您需要合并多个值时,运算符方法更具可读性。这适用于 C# 的其他较新功能,例如 lambda 表达式、LINQ 糖语法等。混淆实际意图代码的代码越少,意图应该/将会越清晰。

于 2009-08-24T19:46:05.520 回答
2

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

public int doSomeWork(string value) {
   int someValue;
   if (String.IsNullOrEmpty(value)) {
      someValue = 0;
   } else {
      someValue = Int32.Parse(value);
   }
}
于 2009-08-24T19:52:57.470 回答
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 关于重构的书(现在想读更长的时间),这是我通常喜欢的,我发现它也是书中普遍建议的“模式”。

于 2009-08-24T19:53:34.227 回答
1

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

其中一部分更具可读性。我站在你老板一边。

于 2009-08-24T19:47:34.033 回答
1

另一种解决方案是

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

于 2009-08-24T19:48:12.007 回答
1

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

于 2009-08-24T19:50:39.427 回答
1

实际上你可以重构为

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

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

于 2009-08-24T19:55:35.220 回答
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;
}
于 2009-08-24T19:45:59.437 回答
0

你可以按你的方式做吗?凉爽的!

If 绝对更具可读性,除非每个人都比我更像 C# 专家。

于 2009-08-24T19:47:09.293 回答
0

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

两者在语义上的区别是that??是一个表达式,whileif是一个语句。表达式说“执行计算并返回结果”,正是您寻求的语义。必须做更多的工作才能让if语句表达相同的语义;除此之外,if除了计算之外,还有更多的逻辑空间,你不需要的空间。

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

于 2009-08-24T19:59:03.683 回答