Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 61
Текст из файла (страница 61)
Встроенные числовые объекты используют стандартные строки числовых форматов или пользовательские форматные строки, определенные .()(ЕТ Ргзгпеиюг(г, описание которых можно найти в документации МВ(3(Ч, выполнив поиск "э(апбагб пшпег(с (оппаг Я1х(пяв". Стандартные форматные строки обычно имеют форму Ахх, где А — запрашиваемый формат, а хх — необязательный спецификатор точности. Примерами спецификаторов формата для чисел могут служить: "С" — для ВалЮты, "0" — для десятичных чисел, "Е" — для научной нотации.
"Р" — для нотации с фиксированной точкой и "Х" — для шестнадцатеричной нотации. Каждуяй тип поддерживает также спецификатор "Я" для обозначения общего вида, которым является спецификатор формата по умолчанию и который применяется, когда производится вызов ОЬЯесС.Тоягг1пд без указания форматной строки. Если эти форматные строки не отвечают существующим потребностям, можно даже применять одну иа пользовательских форматных строк, позволяющих описать то, что нужно, в более или менее наглядном виде.
Суть всего этого механизма заключается в том, что каждый тип интерпретирует и определяет форматную строку специфично для контекста его собственных нужд. Другими словами, Яуэсеи. ВопЬ1е вполне может трактовать спецификатор формата "Я" иначе, чем тип яуэсеж. 1пс32. Более того, пользовательский тип, скажем, еир1оуее, волен определять форматные строки по своему усмотрению. Например, форматная строка "ЯБМ" может порождать выходную строку, содержащую номер карточки социального страхования сотрудника. На заметку! Что даже еще удобнее — пользовательским типам можно позволить обрабатывать форматную строку 5 ВВЯ", создавая детализированную строку, которая представляет внутреннее состояние, для отправки в выходной журнал отладки. Рассмотрим небольшой пример кода.
в котором используются описанные выше концепции; пэгпд Бузсего пз1пя Яуэтет.31оЬа11гаггоп) пэ1пд Яуэтеи.игпсонз.готте) рпбугс с1азз ЕптгуРогпт ( зта11с тога Магп() ( Сп11пте1пго спттепс = Сп11пте1пго.СпггепГСэ1тпте) Сп1тпге1пго яегжэпу = пен Сп1тпте1пго ( "ое-ОЕ" Сэ1тпте1пго гпзэгап = пен Сп1тпте1пго ( "гп-КШ' сопЬ1е пюпеу = 123.45) зтгтпс 1осз1Мопеу = топеу.тоЯГт1пч( "С", сптгепт Мезээяевох.Ялом( 1оса1Мопеу, "Локальные деньги" 1оса1Мопеу = иопеу.тоБСггпя( "С", яетиапу ) 1 МеэээдэВсх.БЬон( 1оса1Мопеу, "Деньги Германии" ); 1оса1Мопеу = испеу.тоБГт1пд( "С", гпзэгэп )) МезэасэВох.БЬон( 1оса1Мопеу, "Деньги России" ); В этом примере отображается строка с использованием типа Мез задевох, определенного в Яуэсет. Х1поон.
Роппз, поскольку консоль не особенно подходит для вывода символов 1)штебе. Выбранный спецификатор формата — "С" — служит для отображения числа в формате валюты, для первого отображения используется экземпляр Со11 и ге1п Го, при- 230 Глава 8 соединенный к текущему потоку, а для второго создастся Сн1гпге 1п Го для ]Ърмании и России. Обратите внимание, что при формировании строки тип 5уя сев. РопЫе использует свойства спггепсупесаиа15ерагагог. спггепсуРес1иа1Ргдася и спггепсубупьо1 экземпляранппЬегГогиас1пТо, возвращенного методом Сп1спге1пТо.беГГогпас. Если бы отображался экземпляр РасеТ1ие. то аналогичным образом реализация РасеТ1пе метода 1Гогваггаые.
тоясгапд использовала бы акземпляр РагетапеГогиас1пто, возвращенного методом Сп1гпге1пТо. БеСГогиаг. СОПВО1Е.ЯЕХ1ЕЫПЕ И Я~~~Пд. УОХПай В примерах, повсеместно приводимых в книге, интенсивно используется метод сопяо1е. нгасеьапе. Одна из удобных форм этого метода, идентичных некоторым перегрузкам Ягг1пд. Гогиаг, позволяЕт строить составнЫе строки, замЕняя дескрипторы формата внутри строки переменным количеством переданных параметров. На практике метод я сг1пд. Гогияг подобен семейству функций рггпг Т из С и С++. Однако он намного гибче и безопаснее, поскольку основан на средствах форматирования .]дЕТ Ггагпежог)г, описанных ранее. Взглянем на следующий пример использования Бгг1пд.
Гоппа(и иягпд Бузсепп пя1пд Буяпес.51ооз11гаггопл пягпд Буяпеи.кгпс(оня.гогиял рпЬ11с с1аяя ВппгуРогпп япаггс пагб Ма1п( ясггпд(] агдя ) ( 11( агдя.Ьепдпл < 3 ) ( Сопяо1е.нгггеьгпе( "Введите 3 параметра" гегпгпл ) япггпд соироятге = Япгтпд.гогияп( "(О) + (1) = (2)" агдя[0], агдя[1], ягдя[2] Сопяо1е.нггсе[гпе( соироягпе ); Как видите, указатель места заполнения представлен числом в фигурных скобках, которое является индексом в следующем далее списке аргументов.
Метод 5гтапд. Го гтас, как и Сопя о1е . Игасе11пе, имеет перегрузку, принимающую переменное количество аргументов для использования в качестве подставляемых значений. В данном примере реализация метода Бсггпд. Гестас заменяет каждый указатель места заполнения, используя общее форматирование типа, которое получается в результате вызова на этом типе версии ТоБГггпд без параметров. Если экземпляр, подставляемый в данное место, поддерживает 1ГогиапсаЬ1е, то вызывается метод 1Гогиасгаые. тоБгггпд со спецификатором формата пп11, что обычно эквивалентно применению спецификатора "6".
Кстати, если внутрь исходной строки нужно поместить фигурные скобки, которые должны отображаться при выводе, их необходимо дублировать, те. ( ( или ) ). Точный формат подставляемого элемента выглядит как (индекс [, выравнивание) [: форматналСтрока] ) . где элементы внутри квадратных скобок не обязательны. Значение индекс отсчитывается от нуля и используется для ссылки на один из завершающих аргументов, переданных методу. Значение выравнивание представляет ширину, которая отводитсн элементу внутри составной строки.
Например, если ширина Работа со строками 231 установлена равной восьми символам и передана более короткая строка, то она будет дополнена пробелами до ааданной ширины. И,наконец, часть форматнаяСтрока подставляемого элемента позволяет обозначить точный формат. Форматная строка — зто строка в определенном стиле, которая должна использоваться, если планируется вызов 1ГотваССаЬ1е.ТоЯСт1пс на самом экземпляре, о чем говорилось в предыдущем разделе. К сожалению, указывать отдельный экземпляр ТГогвасРтоуабет для каждой из подставляемых строк нельзя. Вспомните,что метод ТГбтваССет.тоБСг1по принимает 1ГогвасРгоч1с(ег. Однако при использовании ясг1пс.уотвас и строки заполнителя,как было показано ранее.
ЯСгспс.уотваС просто передает значение пц11 для 1ГогвасРгочск)ег,когда вызывает 1Гогвассег.тоясгспс. В результате применяются форматеры по умолчанию, ассоциированные с культурой текущего потока. Если нужно создать составную строку из элементов, используя множество поставщиков форматов или множество культур, следует непосредственно применять ТГогвассаЬ1е . то я стспд. Примеры строкового форматирования в пользовательских типах Давайте рассмотрим другой пример использования знаменитого типа Совр1ех, с которым мы упражняемся на протяжении всей этой книги.
На этот раз попробуем реализовать ТГотваССаЬ1е, чтобы сделать его несколько более удобным для генерации строковой версии экземпляра. наспех Яузгевт наспех Бузгев.ТехС; цеапд Бузгев.61опа11гаС1опк рцЬ1тс зттцст Совр1ех: ГГотваттаЬ1е рцЫ1с Совр1ех( боцЫе теа1, боцЫе 1васспату ) ( СЫз.теа1 = теа1т сЫз.твадтпату = 1вадспату; ) // Реализация 1ГотваттаЬ1е РЦЫтс зстспд Тозттспс( зстспд Тотвас, 1ГотваСРточтбет ХотваСРточ1т)ет ) ( БСт1псВц11оет зЬ = пен БтттпдВцт1бет()т тб( Тотват == "ВВБ" ) ( // Генерация отладочного вывода для данного объекта зЬ.Аррепб( сщз.Яегтуре().тоБСтспп() + "сп" )т зЬ.АРРепбуотваС( "ССдейсгвительная:СС(0)Сп", теа1 ); зЬ.Аррепбуптват ( "Стмнимая:СС( 0) сп", 1вадспату ) т ) е1зе ( зЬ.Аррепб( "( " зЬ.АРРепд( теа1.ТЬБСт1по(сотваС, сптваСРточтбет) )т зЬ.АРрепс)( " зЬ.Аррепк)( 1васспату.Тпзттспд(сотват, ТотваСРточсбет) ); зЬ.АРрет1б( " )" )1 тетцтп зЬ.ТоЯСтспс О; ) Рттчасе боцЬ1е теа1; ртГчате бпцЫе 1ваптпатук ) 232 Глава 6 риЬ11с с1ввв ЕптгуРогпт ( втзтас чо1с Маап() ( Си1тиге1пго 1осв1 Си1тиге1пГо.сиггептси1тигег Си1тиге1пго оегазпу = пеы Си1тиге1пГо ( "ие-ОЕ" ); Сотр1ех срх = пеы Соар1ех( 12.3А56, 1234.56 )) втг1пд втгСрх = срх.тсБтт1пи( "Г", 1осв1 ); Сопво1е.кггтеьапе( зтгсрх )~ вттСрх = срх.тоБгг1пд( "Г", оегазпу ); Сопзо1е.ктттеьапе( втгСрх )> Сспзо1е.нг1теьапе( "1поглвдочхый вывод: 1п(0:ОВО)", срх ); ) Основной код этого примера сосредоточен внутри реализации 1ГотааттаЬ1е.
тоБтг1пд. Для данного типа реализована форматная строка "ОВО", которая создает строку, отображающую внутреннее состояние объекта, и которая может пригодиться в целях отладки. Понятно, что можно предоставить и больше информации об экземпляре для вывода в журнал отладки, но идея должна быть ясна. Если форматная строка не равна "ОВО", то просто выполняется обращение к реализации 1ГоттаттзЬ1е типа Бувгеи.паиЬ1е. Обратите внимание на применение Бгт1пдВи11оег (см.
раздел "Бтт1пдВи11оег" далее в этой главе) для создания строки, возвращаемой в конечном итоге. Также было решено испольэовать метод сопзо1е.хтагеьапе и его синтаксис формата экземпляра для отладочного вывода на консоль — просто, чтобы продемонстрировать разнообразие применения. ХСПВ~ОПйОЕ1Ва1~ЕХ 1сизгоаГотпаттет — это интерфейс, позволяющий заменять или расширять встроенный или существующий интерфейс 1ГотваттаЬ1е объекта.
Всякий раз, когда вызывается ятг1пд. Гогазт или Бтт1пяВи11с(ет.)(ррепг)Готызг для преобразования экземпляра объекта в строку, перед тем, как произойдет вызов через реализацию 1Гогаагтзь1е.тоБтт1по объекта или Оь)ест.тоБтт1по,если интерфейс 1Готиаттаь1е не реализован, сначала выполняется проверка, не предоставляет ли переданный 1ГотизгРточ1оет собственного средства форматирования.














