Вопрос по интерфейсу IFormatable в C#

258
29 октября 2017, 17:10

Здравствуйте, хочу разобраться с IFormatable и IFormatProvider

  1. ToString у IFormatable принимает два параметра. Первый нужен, что бы понимать как форматировать, а второй тоже самое только более подробное и конкретное описание. Вопрос вот какой, зачем тогда первый, если второй уже все содержит? Они вообще могут друг другу противоречить. К примеру я первым параметром указал, что у цифр в качестве разделителя должна быть точка, а второй параметр(моя культура) утверждает, что должна быть запятая.
  2. IFormatProvider у него есть метод object GetFormat(Type formatType). Вопрос, вот почему он возвращает object? Да это же можно, что угодно вернуть, почему его не сделали хотя бы обобщенным? К примеру ToString у double пытается IFormatProvider привести к CultureInfo или NumberFormatInfo (тогда да, он понимает к чему можно привести результат GetFormat). Да с чего он взял что я вообще передам ему какой из этих типов (CultureInfo или NumberFormatInfo)?
Answer 1

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

Обычно в качестве провайдера формата выступает язык. Например, если вы хотите полный формат даты на немецком языке, то вы указываете в форматной строке, что вам нужна именно длинная дата, а провайдером формата выбираете CultureInfo.GetCultureInfo("de-DE").

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

Answer 2

почему он возвращает object?

Потому что он был добавлен в .NET Framework 1.1, когда ещё не было обобщений

READ ALSO
Проблема с вечным циклом в С#

Проблема с вечным циклом в С#

В коде ниже бесконечно выполняется (повторяется) одно действиеВ чем может быть проблема?

239
Асинхронная загрузка в Unity

Асинхронная загрузка в Unity

Можно ли подгрузить следующую сцену в текущей, но не запускать её? К Примеру, метод SceneManagerLoadSceneAsync() запускает сцену сразу после загрузки

348
c# как распознать текущую ссылку?

c# как распознать текущую ссылку?

как распознать текущую ссылку, это просто ссылка или на файл?Ps

250
Вставка JSON в MySQL (C#)

Вставка JSON в MySQL (C#)

ЗдравствуйтеНе получается вставить JSON в MySQL в C# (MySql

295