Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 122
Текст из файла (страница 122)
специфицирующей формат, которая сопровождается необязательным числом от 0 до 99, указывающим точность. Например, ГЯ специфицирует, что тип п)ооЬ1е должен отображаться в виде числа с плавающей точкой с пятью значащими цифрами. Типы не обязаны поддерживать все форматы за исключением формата 6, который означает "яепегаГ (общий). фактически формат 6 — это то.
что получается при вызове версии ОЬ) есС. Тоятт1пд без параметров на большинстве объектов из стандартной библиотеки. Некоторые типы игнорируют спецификаторы формата в специальных случаях. Например, Яузтев. ОооЬ1е может содержать специальные значения, представляющие как ()ч)ос а )ч)шпьег — не число], Росастпе1пгапасу (положительная бесконечность) или Кедаттке1пгсптеу (отрицательная бесконечность). В таких случаях Я уз Сею.
ОооЬ1е игнорирует спецификацию формата и отображает символ, соответствующий культуре, как указывает НсппЬетГотмзт1пго. Спецификатор формата может также состоять из пользовательских строк формата. Пользовательские форматные строки позволяют пользователю задавать точную компоновку чисел, смешивая со строковыми литералами и т.п., с использованием синтаксиса, описанного в разделе "Спзсош )чшпег)с РЬппаС Бсг)пя" документации МБР)ч. Клиент может специфицировать один формат для отрицательных чисел, другой — для положительных, а третий — для нулевых значений. За подробным описанием разнообразных возможностей форматирования обращайтесь к документации МБР)ч).
Как видите, реализация 1ГотмаССаЬ1е. Тозтт1пд может оказаться довольно утомительной, особенно в связи с тем, что форматная строка может быть в высшей степени настраиваемой. Однако во многих случаях — и пример Оотр1ехнопапет один из них — вполне можно положиться на реализации 1ГотматтаЬ1е стандартных типов. Поскольку Сомр1ех)(птЬет использует я уз Сев. ОоиЬ1е для представления вещественной и мнимой частей, большую часть работы по реализации 1ГотмаССаЬ1е можно возложить на яузтет.
РоиЬ1е, давайте рассмотрим модификации примера Сомр1ехиипЬет, 456 Глава 13 необходимые для поддержки 1рогщаССаЬ1е. Предположим, что тип Сощр1ехнпщЬег будет принимать форматную строку в точности так же, как это делает Буяяещ. РопЬ1е, и что каждый компонент комплексного числа будет выводиться с использованием этого формата. Конечно, лучшая реализация может предоставлять и дополнительные возможности вроде спецификации того, должен вывод быть представлен в декартовом или полярном формате, но это оставляется в качестве упражнения. пягпд Яуяоехы пя1пд Буясещ.01оьа11гаг1опв рпЬ11с яеа1еб с1аяя Сощр1ехнпщЬег: 1РогщассаЬ1е ( рпЬТТс Сощр1ехкпщЬег( бопвае геа1, боппае гщадбпагу ) ( СЬ1я.геа1 = геа1; ГЬ1я.
1щад1пагу = Ыяадтпагув ) рпп11с очегггбе яог1пд ТоБСг1пд() ( геспгп Тозяг1пд( "С", пп11 )) ) // Реализапия 1РогщассаЬ1е. рпЬ1гс яог1пд ТоЯСг1пд( яяг1пд Тогщая, 1рогщаяргочббег Тогщаяргоч1бег ) ( ягггпд геяп1г = "(" геа1.ТФЯСг1пд(гогщая, Еогщаяргоч1бег) геа1.ТФБГг1пд(тогщая, Тогщаяргочгбег) ") "7 гегпгп геяп1гв // Прочие методы опущены для ясности. рггчасе геабоп1у бопЬ1е геа1~ рггчаге геабоп1у бопЬ1е 1щад1пагув ) рпвтгс яеа1еб с1аяя ЕпсгуРо1пя ( ялас1с чогб Мабп() ( Сощр1ехяпщЬег ппщ1 = пен Сощр1ехяпиЬег( 1.12345678, 2.12345678 ); Сопяо1е.кг1се11пе( "Формат РБ: (О)", пшя1.ТоЯГгьпд( "Р5", пен Сп1япге1пто("еп-РЯ") ) )4 Сопяо1е.кг1се11пе( "Формат РЕ: (О]", пшя1.тоЯГгбпд( "Р5", пен Сп1япге1пбо("бе-РЕ") ) ); Сопяо1е.иггяеЬгпе( "РЬ7'есс.тоБСг1пд П: (0)", пшл1.ТоЯ(гбпд() ); Ниже показан вывод этого примера: Формат ПБ: (1.12346 2.12346) Формат РЕ: (1,12346 2,12346) РЬ7'есГ.ТоБСг1пд(): (1.12345678 2.12345678) Обратите внимание в Магд на создание и использование разных экземпляров Сп1Спге1пуо.
Первый Сотр1ехкпщЬег выводится с применением форматирования для культуры Ашег(сап, а второй — для Оеппап. В обоих случаях задается вывод толь- Я поисках канонических форм С(( 457 ко пяти значащих разрядов. Вы увидите, что реализация 1уогвассаЬ1е. ТоЯСгзпд типа яувсем.
РооЬ1е даже округляет значение, как и ожидалось. И, наконец, переопределение ОЬЯесг. тоясгзпд реализовано так, что поручает форматирование методу 1ЕогтаггаЫе. ТоЯГгупд с общим форматом 6. Интерфейс 1 РогмассаЬ1е предлагает клиентам объектов мощные возможности, когда у них возникают специфические потребности в форматировании. Однако эта мощь достигается ценой реализации. Реализация 1ГогмассаЬ1е. ТоЯсг1пд может быть очень сложной задачей, которая потребует много времени и внимания. Является ли а~ее~ преобразуемым? Компилятор СЗ предоставляет поддержку преобразования экземпляров простых встроенных типов значений, таких как 1пг и 1оод, из одного типа в другой через приведение, генерируя код (Ь, который использует (Ь-инструкцию сопч. Инструкция сопч хорошо работает с простыми встроенными типами, но что делать, если необходимо выполнять преобразование строки в целое число и наоборот7 Компилятор не может сделать это автоматически, поскольку такое преобразование является потенциально сложным и даже требует параметров вроде информации о культуре.
В .(к(ЕТ Ггакпе юог(к предлагается несколько способов выполнения такой работы. Для нетривиальных преобразований, которые невозможно выполнить простым приведением, необходимо полагаться на класс Яувгем. Сопчегс. Здесь не будут перечисляться все функции, реализованные классом сопчегг, поскольку их список очень большой. Как всегда, рекомендуется заглянуть в документацию МЗО(к(. Класс Сопчегг содержит методы для преобразования почти любого встроенного типа в любой другой, если только такое преобразование имеет смысл.
Поэтому для преобразования к(ооЬ1е в Ясг1пд достаточно просто вызвать статический метод Тозсг1пд, передав ему с(ооЬ1е, как показано ниже: вгакгс чокб На1п(( ( к(ооЬ1е к( = 12.1; ветками вкг = Сапчегк.Товкгзпд( к( ( Подобно 1ГогмасгзЫе. ТоЯСг1пд, метод Сопчегг. ТоЯГг1по имеет различные перегрузки, которые также позволяют передавать объект Со1коге1пйо или любой другой объект, поддерживающий 1уогкзСРгоч1с(ег, чтобы указывать информацию о культуре при выполнении преобразования. Можно также использовать такие методы, как Товоо1еап и То((1пг32. Общий шаблон имен методов, очевидно, выглядит как ТоХХХ, где ххх — тип, к которому выполняется преобразование.
Бувгем. соочегг. даже имеет методы для преобразования байтовых массивов в закодированные по алгоритму Ьаве64 строки и обратно. Зти методы очень удобны, если двоичные данные хранятся в тексте ХМЬ или в любом другом текстовом формате. Метод Сопчегс удовлетворит большинство потребностей в преобразованиях между встроенными типами. Он представляет собой универсальный инструмент для преобразования объекта одного типа в другой. На это указывает богатство методов, которые он поддерживает.
Однако что если понадобится преобразовать тип, о котором Сопчегс ничего не знает7 Ответ кроется в методе Сопче ге . СЬапоеТуре. сьвпдетуре — это механизм расширения яувсем. сопчегг. Он имеет несколько перегрузок, включая те, которые принимают поставщика формата для информации о культуре. Общая идея состоит в том. что он принимает объектную ссылку и преобразует ее в тип, представленный переданным объектом яувгем. Туре. Ниже приведен код, в ко- 458 Глава (3 тором используется тип Совр1ехкшпЬег из предыдущих примеров и предпринимается попытка преобразования строки с помощью яуясев.сопуегг.сьапяетуре; ия1оо Яузгев; рпЬ11о зеа1ес о1аяз Совр1ехкшпЬег ( роЬ11с Совр1ехковЬег( п)оиЬ1е гез1, п(оиЬ1е Твад№оагу ) ( Гвья.геа1 = гее1; Гвья.ьвачуозгу = 1вад1пагу; ) // Прочие методы опущены для ясности. ргауапе гезп(од1у п(ооЬ1е геа1; рггчасе геап)оо1у п)ооЬ1е 1ве81оагу," ) риЬ11с яеа1еп( с1аяя Яппгуро1пс ( япапас уогд Ма1о() Совр1ехковЬег оов1 = пен Совр1ехновЬег( 1.12345678, 2.12345678 )) япг1пч зяг = (япг1пд) Сопуегп.СЬзпдетуре( днв1, Гуреог(ясг1пч) ); Этот код компилируется нормально.
Однако во время выполнения возникает сюрприз в виде исключения с сообщением "ОЬ)ес( пшз1 (шр(ешеп1 1Сопуег11Ь1е" (Объект должен реализовать 1СопуегГТЬ1е).Несмотря нато что СЬзпдетуре — это механизм расширения яуягев.Сопуегг, такая расширяемость не дается даром. Чтобы заставить СЬапоетуре работать с Совр1ехмовЬег,понадобится приложить определенные усилия, которые, как и можно было догадаться, состоят в реализации интерфейса 1СодуегсаЬ1е. Интерфейс 1сопуеггаЬ1е — последнее средство, когда речь идет о преобразовании объектов. Если необходимо, чтобы пользовательские объекты хорошо работали с Яуясев.Сопуегп и другими типами, преобразование которых может понадобиться, то лучше реализовать 1СооуегсаЬ1е.










