当我查看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源代码中看到它时,我想也许有一个原因,我错过了一些东西。如果有原因,它是什么?
答案 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;
}