Преобразуйте перечисление для строкового представления

Который является предпочтительным способом преобразовать Перечисление в Строку в.NET 3.5?

  • Перечисление. GetName
  • Перечисление. Формат
  • ToString

Почему я должен предпочесть один из них по другим? Каждый работает лучше?

155
задан user2864740 29 October 2019 в 19:08
поделиться

6 ответов

Все они внутренне заканчивают тем, что назвали метод названным InternalGetValueAsString. Различие между ToString и GetName было бы то, что GetName должен проверить несколько вещей сначала:

  1. тип, который Вы ввели, не является пустым.
  2. тип, который Вы ввели, на самом деле перечисление.
  3. значение, в котором Вы передали, не является нулевым.
  4. значение, в котором Вы передали, имеет тип, который может на самом деле использовать перечисление, поскольку это лежит в основе типа, или типа самого перечисления. Это использует GetType на значении для проверки этого.

.ToString не должен волноваться ни об одном из них выше проблем, потому что это называют на экземпляре самого класса, а не на переданном в версии, поэтому, вследствие того, что .ToString метод не имеет тех же проблем проверки как статические методы, я пришел бы к заключению, что .ToString самый быстрый способ получить значение как строку.

20
ответ дан 23 November 2019 в 21:55
поделиться

Лучше всего я могу найти, этот несвязанный вопрос на MSDN, который содержит отрывок XML, который отвечает на этот вопрос. Любой из этих методов совместно использует тот же дефект: они звонят enum.toString(), который не работает правильно при использовании Dotfuscation. Другие проблемы, кажется, касаются косвенной упаковки (GetName и Формат). К сожалению, я не могу найти причины производительности использования ни одного вышеупомянутого.

Перефразирование от xml отрывок ,

Передача помещенного в коробку перечисления для строкового представления. Формат () или любая другая функция может привести к enum.ToString() называемый. Это вызовет проблемы когда Dotfuscating. Вы не должны использовать enum.ToString(), enum.GetNames(), enum.GetName(), enum.Format() или enum.Parse() для преобразования перечисления в строку. Вместо этого используйте оператор переключения и также интернационализируйте имена при необходимости.

17
ответ дан 23 November 2019 в 21:55
поделиться

Enum.GetName()

Format() действительно просто обертка приблизительно GetName() с некоторой функциональностью форматирования (или InternalGetValueAsString(), чтобы быть точным). ToString() в значительной степени то же как Format(). Я думаю GetName(), наилучший вариант, так как полностью очевидно, что это делает для любого, кто читает источник.

15
ответ дан 23 November 2019 в 21:55
поделиться

Я создаю метод расширения "Описания" и присоединяю его к перечислению так, чтобы я мог получить действительно удобное для пользователя именование, которое включает пробелы и преобразование регистра. Мне никогда не нравилось использовать само перечисление значений в качестве отображаемого текста, потому что это - что-то мы, разработчики используют для создания большего количества читаемого кода. Это не предназначается в целях дисплея UI. Я хочу смочь изменить UI, не проходя и изменяя перечисления на всем протяжении.

8
ответ дан 23 November 2019 в 21:55
поделиться

Я не знаю то, что "предпочтительный" метод (спросите 100 человек и получите 100 различных мнений), но сделайте то, что является самым простым и что работы. GetName работы, но требует намного большего количества нажатий клавиш. ToString(), кажется, делает задание очень хорошо.

6
ответ дан 23 November 2019 в 21:55
поделиться

ToString() дает, большинство очевидный следует из перспективы удобочитаемости, в то время как использование Enum.GetName() требует, чтобы немного больше умственного парсинга быстро поняло то, что его попытку сделать (если Вы не видите шаблон все время).

С точки зрения чистой производительности, как уже обеспечено в ответе @nawfal, Enum.GetName() лучше.

, Если бы производительность является действительно Вашей целью, хотя, было бы еще лучше обеспечить поиск заранее (использующий Словарь или некоторое другое отображение).

В C++ / CLI, это было бы похоже

Dictionary<String^, MyEnum> mapping;
for each (MyEnum field in Enum::GetValues(MyEnum::typeid))
{
    mapping.Add(Enum::GetName(MyEnum::typeid), field);
}

Сравнение с помощью перечисления 100 объектов и 1 000 000 повторений:

Перечисление. GetName: ~800ms
.ToString (): отображение словаря ~1600ms
: ~250ms

0
ответ дан 23 November 2019 в 21:55
поделиться