В этом коде... нет, он просто избыточен и даже немного медленнее, потому что String.Format()
снова вызовет ToString()
на самом string
.
В случае, если String.Format()
используется с IFormatProvider
, явное ToString()
переопределит его.
Правки (из комментариев): примечание о производительности. Это может быть или не быть медленнее (бесполезный вызов ToString()
) по сравнению с боксом примитивного типа (int
). Мы должны измерить это, но это довольно сложно сказать. Что медленнее? Вызов виртуальной функции или бокс? Имеет ли это значение по сравнению с String.Format()
общим временем? На это уже отвечено здесь, на SO . IMO, если это было сделано как умная оптимизация, это довольно бесполезно.
Представление
OP сделал для этого небольшой тест (см. комментарии), просто для развлечения, результаты на моей тестовой машине:
Test Time [ms]
With ToString 0.002929
Without ToString: 0.003414
Я переписал тест, чтобы не использовать потоки (потому что он добавит больше переменных, ядра могут отличаться, и ОС будет загружать их динамически). С этим (более простым!) Тестовым кодом (полученным из теста OP):
Stopwatch sw = new Stopwatch();
sw.Start();
for (int x = 0; x < Count; x++)
{
_temp = MakeKeyToString(1, "Ashley", "MyBrand");
}
sw.Stop();
TimeSpan test = TimeSpan.FromMilliseconds((double)sw.ElapsedMilliseconds);
Я понимаю, что версия ToString()
быстрее (для Count = 1000000
) в среднем около 10/20 наносекунд. IMO, чтобы измерить что-то настолько маленькое, нам нужна гораздо лучшая тестовая среда и более профессиональный подход. Изменение его кода для String.Format()
для использования IFormatProvider
:
string MakeKeyToString(int SnapshotID, string UserName, string BrandName)
{
return string.Format(CultureInfo.InvariantCulture,
"{0}:{1}:{2}", SnapshotID.ToString(), UserName, BrandName);
}
Снова все меняем: без ToString()
быстрее на 200 наносекунд. Опять же слишком мало, чтобы измерить таким образом.
Выводы
Вы даже не можете начать рассматривать это как оптимизацию, слишком много факторов будет влиять на это, и это настолько мало, что останется незамеченным по сравнению с общим String.Format()
временем. Что еще хуже, это может привести к тонким ошибкам, если вы измените String.Format()
на использование IFormatProvider
, потому что это заставит вас остановиться и подумать: "Почему это? Должна быть причина, связанная с культурой. Может быть...", когда на самом деле...( наверное) нет.
person
Adriano Repetti
schedule
12.12.2013
SnapshotID
этоint
. КакSnapshotID
может бытьnull
? - person Soner Gönül   schedule 12.12.2013int
не может бытьnull
.Format
все равно будет просто вызыватьToString
на входах (если не нуль), насколько я помню. - person Grant Thomas   schedule 12.12.2013