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

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

有帮助吗?

解决方案

甚至更多的检查可能在它 - -

我个人会去你的老板的修正版本,如果字符串的空,你会像你说的抛出一个异常,因为“”不是很好格式化的数量和??只检查空。

是这样的:

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 并返回它。不使用合并运算符,也不使用字符串方法。此方法还处理解析时可能引发的异常(除非您想要异常......)。

我觉得你最好的选择是做你的老板的话,这个人是不值得的!这就是说,加入了您的周围的几个空格,我喜欢它更好的。

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

我肯定更喜欢空聚结操作者(??)在一系列的if语句。尤其是当你需要合并多个值,运营商的做法是更具可读性。这起着成的C#其它较新的功能,如λ表达式,LINQ糖语法等较少的代码有浑了实际intentful代码,更清晰的意图应/将是

为什么解析字符串“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;
}

目前,我正在读书 马丁*本书在重构 (想读它已经为一个更长的时间现在),这是什么我通常喜欢而且我发现这也是一个通常建议的"模式"的书。

的两个选项是不等价的。从在所述第二片段中的错误的部分(它应该读if(string.IsNullOrEmpty(value)),它将处理两种情况下,空和空字符串,而操作者??只处理空值。

一个部分从它的方式更具有可读性。我一边跟你的老板。

另一种解决方案是

INT someValue中= string.IsNullOrEmpty(值)? 0:int.Parse(值);

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

其实你可以重构,以

VAR值= 0;结果   int.TryParse(yourString,超时值);

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

您可以做你的方式?酷!

如果肯定更可读的,除非大家比我更一个C#书呆子的。

在这种情况下,较早的是作为其一个简单的例子更具有可读性。 **然而,在你的情况下,他们是不等价的,作为?是不一样的string.IsNullOrEmpty **

,后者将在其中如果是复杂的情况下更好。我想说的课程马。只是取决于观众。尽量保持简单。

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;
}

[只假设你需要检查空,而不是空字符串,也就像其他人指出]

两者之间的语义不同的是,??是表达,而if是一个语句。一种表达说“进行计算并返回结果”,正是你所寻求的语义。更多的工作也要做,以允许if语句表达相同的语义;除此之外,if余地比计算,房间就不需要更多的逻辑。

,因为它表达了我们所要的目的,您应该使用??操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top