Является ли это утверждение излишним или нет?
Когда я смотрел 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
true, то как может быть values[index].ToString() == null
true? Насколько мне известно, ToString
всегда нужно что-то возвращать, верно? Даже если тип не переопределяет метод ToString
, он должен возвращать полное имя типа Type (Namespace + имя класса). Поэтому, когда я вижу его в исходном коде .NET Framework, я подумал, что, может быть, есть причина, и я пропускаю что-то. Если есть причина, что это такое?
Ответы
Ответ 1
Технически это не избыточно, поскольку возможно, что реализация объектов ToString
возвращает null
. Конечно, это не очень полезно, и пользовательские типы не должны этого делать.
Практически в вашем случае, однако, проверка избыточна, потому что StringBuilder
отлично, если аргумент Append
равен null
. Он просто ничего не добавит:
StringBuilder sb = new StringBuilder("A");
sb.Append((string) null);
sb.Append("B");
Console.WriteLine(sb.ToString() == "AB"); // true
Ответ 2
Я предполагаю, что вы можете переопределить ToString
и вернуть null.
public override string ToString()
{
return null;
}