这个if语句是否多余?

时间:2014-01-15 22:53:54

标签: c# string

当我查看String.Join方法实现时,我看到了这样的for循环:

public static string Join(string separator, params object[] values)
{
  ...
  for (int index = 1; index < values.Length; ++index)
  {
    sb.Append(separator);
    if (values[index] != null) // first if statement
    {
      string str2 = values[index].ToString(); 
      if (str2 != null)  // second if statement
        sb.Append(str2);
    }
  }
  ...
 }

在这里,第二个if语句对我来说似乎是多余的。我想如果values[index] != null 是真的那么怎么可能values[index].ToString() == null 是真的?据我所知ToString总是必须返回一些东西,对吧?即使类型没有覆盖ToString方法,它也应该返回Type的完全限定名称(命名空间+类名)。所以当我在.NET Framework源代码中看到它时,我想也许有一个原因,我错过了一些东西。如果有原因,它是什么?

2 个答案:

答案 0 :(得分:16)

从技术上讲,它并不是多余的,因为对象的ToString实现可能会返回null。当然,这不是很有用,自定义类型也不应该这样做。

但实际上,在您的情况下,检查是多余的,因为当StringBuilder的参数为Append时,null正常。然后它只会附加任何内容:

StringBuilder sb = new StringBuilder("A");
sb.Append((string) null);
sb.Append("B");

Console.WriteLine(sb.ToString() == "AB"); // true

答案 1 :(得分:12)

我想你可以覆盖ToString并返回null。

public override string ToString()
{
    return null;
}