В моих тестах Enum.GetName
был быстрее и с приличным запасом. Внутренне ToString
звонит Enum.GetName
. Из источника для .NET 4.0, основы:
public override String ToString()
{
return Enum.InternalFormat((RuntimeType)GetType(), GetValue());
}
private static String InternalFormat(RuntimeType eT, Object value)
{
if (!eT.IsDefined(typeof(System.FlagsAttribute), false))
{
String retval = GetName(eT, value); //<== the one
if (retval == null)
return value.ToString();
else
return retval;
}
else
{
return InternalFlagsFormat(eT, value);
}
}
Не могу сказать, что в этом причина, но тесты показывают, что один быстрее другого. Оба вызова включают в себя бокс (на самом деле это вызовы отражения, вы, по сути, извлекаете имена полей) и могут быть медленными на ваш вкус.
Настройка теста : перечисление с 8 значениями, нет. итераций = 1000000
Результат : Enum.GetName => 700 мс, ToString => 2000 мс
Если скорость не заметна, мне было бы все равно и использовать ToString
, поскольку он предлагает гораздо более чистый вызов. Контраст
Enum.GetName(typeof(Bla), value)
с
value.ToString()