2014-01-15 43 views
10

当我看着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方法,它应该返回类型的完全限定名称(命名空间+类名称)。所以当我在.NET Framework源代码中看到它时,我想可能是有原因的,我错过了如果有一个原因,它是什么?

+9

我想你可以实现的ToString和返回null –

+0

你可以更进一步,摆脱'如果(值[指数]!= NULL)'的,太。每[MSDN](http://msdn.microsoft.com/en-us/library/5atxc566.aspx),“Append(Object)方法调用Object.ToString方法获取值的字符串表示形式。如果值是null,对StringBuilder对象不做任何更改。“所以,内部循环可能已被替换为sb.Append(separator); sb.Append(values [index]);'请注意,这两种方法之间可能存在微小的性能差异。 – Brian

回答

16

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

然而,实际上在您的情况下,检查是多余的,因为StringBuilder罚款时Append的参数是null。然后它将只是追加什么:

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

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

这更清楚:)谢谢。 –

+0

'Append'在它的实现中有一个类似的空检查,[深度防御](http://en.wikipedia.org/wiki/Defense_in_depth_(计算))我想 –

12

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

public override string ToString() 
{ 
    return null; 
}