2014-01-15 5 views
10

Wenn ich String.Join Methode Implementierung anschaute, sah ich eine for-Schleife wie folgt aus:Ist diese if-Anweisung redundant oder nicht?

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

Hier zweite if-Anweisung überflüssig scheint me.I dachte, wenn values[index] != nullwahr dann ist, wie values[index].ToString() == null könnte wahr? Soviel ich weiß ToString muss immer etwas zurückgegeben werden, oder? Selbst wenn der Typ die Methode ToString nicht überschreibt, sollte er vollständig qualifizierten Namen (Namespace + Klassenname) zurückgeben. Wenn ich es in .NET Framework-Quellcode sehe, dachte ich, dass es vielleicht einen Grund gibt und ich vermisse etwas. Wenn es einen Grund gibt, was ist es?

+9

Ich nehme an, Sie ToString implementieren könnte und null zurück –

+0

Sie könnten einen Schritt weiter gehen und loszuwerden 'if (Werte [index]! = Null)', auch. Per [MSDN] (http://msdn.microsoft.com/en-us/library/5atxc566.aspx), "Die Append (Object) -Methode ruft die Object.ToString-Methode auf, um die Zeichenfolgendarstellung von value zu erhalten. Wenn value ist Null, es werden keine Änderungen am StringBuilder-Objekt vorgenommen. " Die innere Schleife könnte also durch 'sb.Append (separator) ersetzt worden sein; sb.Append (Werte [Index]); "Wohlgemerkt, es können winzige Leistungsunterschiede zwischen den beiden Ansätzen sein. – Brian

Antwort

16

Technisch ist es nicht überflüssig, da es möglich ist, dass eine ToString Implementierung des Objekts null zurückgibt. Natürlich ist das nicht wirklich nützlich und benutzerdefinierte Typen sollten das nicht tun.

Praktisch in Ihrem Fall jedoch ist die Überprüfung redundant, weil StringBuilder in Ordnung ist, wenn das Argument Appendnull ist. Es wird dann hängen Sie einfach nichts:

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

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

das war klarer :) danke. –

+0

'Append' hat einen ähnlichen Null-Check in seiner Implementierung, [Defense in Depth] (http://en.wikipedia.org/wiki/Defense_in_depth_ (Computing)), denke ich –

12

Ich nehme an, Sie könnten ToString überschreiben und Null zurückgeben.

public override string ToString() 
{ 
    return null; 
} 
Verwandte Themen