FormatProvider против метода расширения против нового класса - PullRequest
5 голосов
/ 10 июля 2009

Я хотел вывести целое число в римские цифры и наткнулся на этот ответ Джесси Слайсера. Это метод расширения, но мне было интересно воспользоваться преимуществом ToString(string, IFormatProvider), чтобы сделать что-то вроде

int a = 10;
string b = a.ToString("RN", provider);
// OR
string c = string.Format(provider, "{0:RN} blah foo", a);

вместо

int a = 10;
string b = a.ParseRomanNumeral();
// OR
string c = string.Format("{0} blah foo", a.ParseRomanNumeral());

Я никогда не писал поставщика форматов, поэтому я не уверен в работе, но вот мой вопрос. Для некоторых четко определенных преобразований формата, таких как римские цифры, вы бы использовали:

  • поставщик формата
  • использовать метод расширения
  • написать класс RomanNumeral, который реализует Parse, TryParse и ToString
  • что-то еще

и почему?

Влияет ли на ваш ответ использование string.Format() и любого из методов двоюродного брата (например, StringBuilder.AppendFormat())? Очевидно, что с помощью методов расширения вы не можете получить доступ к преобразованию, используя один из этих методов форматирования.

Я бы подумал, что пользовательский класс для реализации всей гаммы будет наиболее разумным, но и самым трудоемким. Работа с провайдером нестандартных форматов, похоже, натолкнется на пальцы некоторых существующих вещей глобализации (если они у вас есть).

Ответы [ 3 ]

1 голос
/ 10 июля 2009

Поставщики форматов хорошо работают для ваших собственных типов, но они неуклюжи при использовании встроенных типов, поскольку вам необходимо создать экземпляр поставщика и передать его в метод Format, который устраняет преимущество спецификатора формата. Гораздо удобнее использовать метод расширения непосредственно в int.

1 голос
/ 14 июля 2009

Лично я бы написал класс римских цифр с помощью tryparse, parse + tostring (), с методами расширения для его поддержки, для комбинации всех перечисленных выше причин (включая ваш последний комментарий к ответу шахкальпеша).

0 голосов
/ 10 июля 2009

Полагаю, это зависит от того, как вы собираетесь использовать эту функцию.

ИМО, метод расширения - хороший способ. Не уверен, как это увидят пользователи вашей сборки, работающие с c # 1 или 2 (язык без поддержки методов расширения).

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

...