Главная » Просмотр файлов » Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010)

Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 119

Файл №1160865 Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010)) 119 страницаНэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865) страница 1192019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 119)

° х. ЕЧца1з (х) == Сгце. Зто — рефлексивное свойство эквивалентности. ° х. Ецоа1з (у) == у. Ецоа1з (х) . Это — симметричное свойство эквивалентности. ° х. Ециа1з (у) за у. Ецца1з (г) подразумевает х. ЕЧца1з (г) == Сгое. Это — транзитивное свойство эквивалентности. ° х. Ес(па1з (у) должно возвращать один и тот же результат до тех пор, пока внутреннее состояние х и у не меняется. ° х. ЕЧпа1з (пц11) == Еа1эе для всех х, отличных от пц11.

° Метод Ецоа1э не должен генерировать исключений. Реализация Ецца1з должна подчиняться этим непреложным правилам. Кроме того, чтобы сделать реализации методов Ецца1з для классов более устойчивыми, понадобится следовать и другим рекомендациям. Как уже упоминалось, версия по умолчанию ОЬтесС. Ецца1з, унаследованная классами, проверяет ссылочную эквивалентность, иначе называемую идентичностью. Однако в случаях, подобных примеру с Совр1ехд цвЬег, такая проверка не является интуитивно понятной. Будет более естественным и ожидаемым, если экземпляры такого типа будут сравниваться на основе сравнения их полей — друг за другом. Зто главная причина, по которой необходимо переопределять ОЬбесС.

Ес(ца1з для классов, поведение которых соответствует семантике значений. Давайте еще раз вернемся к примеру Совр1ехкзвЬег, чтобы посмотреть, как это можно сделать: рпЬ11с с1азз Совр1ехиивьег ( рцЬ1(с Совр1ехипвЬег( зпС геа1, ЬпС увадзпагу ) ( СЬ№з.геа1 = геа1; Сбзэ.1вао1пагу = звадупагу; ) рцпузс отегггбе Ьоо1 Ес(па1з( ЬЬ№есС оьт ( Совр1ехиивЬег оСЬег = оЬт' аз Совр1ехицвЬегп 446 Глава (3 11 ( опьег == пп11 ) ( гегпгп Еа1яе; геппгп (сыя.геа1 == ослеп.геа1) аа (СЫя.1ыад1пагу == опьег.тэа01пагу) рпЬ1гс очеггаое тпп Сеснаялсоое О ( геппгп (1пг) геа1 " (1пс) 1ыа01пагуп ) рпЬ11с ясат1с Ьоо1 орегасог==( Соыр1ехыпыЬег ые, Соыр1ехыпвьег осьег ) ( геппгп Еспа1я( ые, огьег )) ) рпЫ1с ясаптс Ьоо1 орегапог! = ( Совр1ехнпыЬег ые, Соир1ехнпвЬег опьег ) ( геппгп ЕЧпа1я ( те, полег ); ) рг1часе СооЪ1е геа1; ргтчасе СопЫе тыадупагу; ) рпЫ1с с1аяя ЕппгуРоапп ( япаптс чогб Матп () ( Совр1ехыпвЬег гегегепсеА = пен Соыр1ехыпыЬег( 1, 2 Соыр1ехноиЬег гетегепсев пеы Соыр1ехыпыЬег( 1, 2 )," Яузпеа.Сопво1е.игапеЬгпе( "Результат проверки на эквивалентностьы (О)", гетегепсеА == гетегепсеВ )) // Если действительно нужна ссылочная эквивалентность.

Яуяпеа.Сопяо1е.игтсеЬапе( "Идентичность ссылок: (О)", (оЬ)есс) гегегепсеА == (оЬ)есс) гегегепсев ); Яуяпев.Сопяо1е.ыгапеьтпе( "Идентичность ссылок: (0)", Ветегепсехйпа1я(гетегепсеА, гегегепсев) ); В этом примере видно, что реализация Ес(па1я вполне прямолинейна, аа исключением проверки некоторых условий. Нужно удостоверитьсн. что обе сравниваемые объектные ссылки не равны пп11 и что они действительно ссылаются на экземпляры СоырехыоыЬег, После этого можно просто проверить поля обеих ссылок, чтобы убедиться в их эквивалентности. Можно даже провести некоторую оптимизацию и сравнивать в Еп(па1я ссылки СЫя и оСЬег. Если они ссылаются на один и тот же объект, можно вернуть сгпе, не сравнивая поля. Однако сравнение двух полей — совершенно тривиальная задача в данном случае, поэтому проверка на идентичность была опущена. В большинстве случаев переопределять СЬ1есС.Еп)па1з для объектов ссылочных типов не понадобится.

Существует рекомендация, чтобы объекты трактовали эквивалентность,используя сравнение на идентичность,что и так получается бесплатно от Оь)ест. ес(па1я. Однако бывают случаи, когда имеет смысл переопределить еп)па1я для объекта. Например, если объект представляет нечто такое, что ведет себя как значение В поисках канонических форм О» 447 и является неизменяемым, наподобие комплексного числа или класса Яуясет.

Бтг1по, тогда, возможно, имеет смысл переопределить Ес!ца1я. придав реализации этого метода в данном объекте семантику эквивалентности значений. Во многих случаях при переопределении виртуальных методов в производных классах, таких как ОЬ ч е с С . Е сто а 1 я, имеет смысл в некоторой точке вызвать реализацию того ясе метода из базового класса. Однако если объект напрямую унаследован от Буягегл. Оьб есс, в этом смысла нет.

Дело в том, что Оьз ест. ес!ца1я, скорее всего, несет в себе семантику, отличающуюся от переопределяемой. Помните, что единственная причина для переопределения Ес!ца1я для объектов — изменение семантического смысла с идентичности на эквивалентность значений. Вряд ли захочется смешивать вместе зти две семантики. Но эта история имеет нелепый поворот. Вызывать версию Ес!ца1я базового класса необходимо, если класс унаследован от класса, отличного от еуясею.

Оьтесс, и в этом другом классе метод Ес!па1я переопределен для представления того же семантического значения, которое подразумевается в производном типе. Дело в том, что наиболее вероятной причиной переопределения в базовом классе метода ОЬч ес к . Еср1а1я является переключение к семантике значения. Для того чтобы определить, нужно ли вызывать версию этого метода базового класса, базовый класс следует хорошо знать. В этом и состоит горькая правда о переопределении Оьбесс.ес!па1я для ссылочных типов. Иногда, даже когда речь идет о ссылочных типах, действительно требуется проверить ссылочную эквивалентность, причем не важно, чего.

Для оценки ссылочной эквивалентности нельзя всегда полагаться на метод Ес!иа1я объекта, поэтому придется прибегнуть к другим средствам, поскольку метод уже может быть переопределен, как в примере с Оолгр1ехгчплсоег. К счастью, существуют два способа выполнить эту работу, которые можно видеть в конце метода Ма!.п из предыдущего примера кода. Компилятор СУ гарантирует, что в случае применения операции == к двум ссылками типа ОЬ1есп всегда получится ссылочная эквивалентность. К тому же Яуягегл. ОЬ1есг предлагает статический метод по имени Ре1е гепсеЕс!о а 1 я, принимающий два параметра-ссылки и возвращающий С гце, если проверка идентичности дает положительный результат. Какой бы способ ни был выбран, результат будет одинаковым.

Факт изменения семантического значения Ес!ца1я для объекта должен быть четко документирован для клиентов объекта. При переопределении Ес!ца1з для класса настоятельно рекомендуется указать семантическое значение в пользовательском атрибуте; подобный прием был представлен ранее в реализации 1С1опеаЬ1е. Таким образом, разработчики, выполняющие наследование от класса и желаклцие изменить семантический смысл Ес!па1я, смогут быстро определить, должны ли онн первым делом вызывать вашу реализацию. Для максимальной эффективности пользовательский атрибут должен служить целям документирования. Хотя этот атрибут н можно проверить во время выполнения, это будет очень неэффективно.

На заметку! Никогда не генерируйте исключений внутри реализации Оьт есс. есгца1я. Вместо этого лучше возвращайте результат 1а1яе. На протяжении всего обсуждения намеренно не упоминались операции эквивалентности, поскольку их стоит рассматривать как дополнительный уровень вдобавок к Оьб ее с. ес!ца1я. поддержка перегрузки операций не является обязательным требованием для СЕВ-совместимых языков. Поэтому не все языки, ориентированные на СЬК, поддерживают их. Ч!япа! Вая!с — один из языков, которые долго не поддерживали перегрузку операций, и в нем такая поддержка в полной мере появилась лишь в версии Ч!япа! Вая!с 2005. Версия Ч!япа! Вая!с .!ЧЕТ 2003 поддерживает вызов перегруженных операций только на объектах, которые определены на языках, поддерживающих зту пе- 448 Глава ) 3 регрузку, при этом они должны вызываться с использованием функции со специальным именем, сгенерированным для операции.

Например, операция оре гас от== реализована с именем ор Ег)ца11гу в сгенерированном коде 1Ь. Наилучший подход предусматривает реализацию ОЬ) ест. Ес)оа1з в качестве основы для любых реализаций орегагог== и орегасог! =, предоставляя последние только как дополнительное удобство для языков, где они поддерживаются. На заметку) Для получения безопасной в отношении типов версии Ег)ца1з подумайте о реализации 1есоасаь1е<т>. Это особенно важно для типов значений, поскольку специфичные для типов версии методов избегают излишней упаковки.

Если переопределен метод есула1в, то необходимо переопределить и Ое1навпСойе Метод бегназЬСог)е вызывается, когда объекты используются в качестве ключей хеш-таблицы. Когда хеш-таблица ищет элемент по заданному ключу, она опрашивает ключ на предмет его хеш-кода и затем использует его для идентификации сегмента, в котором находится объект. Как только сегмент найден, можно проверить, есть ли в нем искомый ключ.

Теоретически поиск в сегменте должен быть быстрым, а сегмент должен содержать очень небольшое количество ключей. Для этого метод бесназЬСог)е должен возвращать достаточно уникальное значение для экземпляров объекта, поддерживающего семантику эквивалентности значений. С учетом сказанного, очень плохо, если алгоритм вычисления хеш-кода будет возвращать разные значения для двух экземпляров, содержащих эквивалентные значения.

В таком случае хеш-таблица не сможет найти сегмент, в котором находится искомый ключ. По этой причине нужно обязательно переопределять 6егназЬСог)е, если для объекта уже переопределен метод Ес)ца1з. Фактически, если переопределен только е<)оа1з, но не бетназЬСог)е, то компилятор С№ сообщит об этом в дружественном предупреждении. Поскольку следует стараться строить код версии класса без выдачи предупреждений, придется отнестись к предупреждению компилятора серьезно. На заметку! Предыдущая дискуссия со всей очевидностью должна продемонстрировать, что любой тип, используемый в качестве ключа хеш-таблицы, должен быть неизменяемым. В конце концов, значение 6еСНазпсог)е обычно вычисляется на основе состояния самого объекта.

Характеристики

Тип файла
DJVU-файл
Размер
8,22 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Нэш Трей - C# 2010
Accelerated_C_2010-4565
3_syntax_overview
3_generics_1.cs
as_1.cs
boxing.cs
conversions_1.cs
implicit_type_1.cs
is_1.cs
references_1.cs
references_2.cs
references_3.cs
values_1.cs
4_classes_structs
4_abstract_classes_1.cs
4_beforefieldinit_1.cs
4_box_1.cs
4_box_2.cs
4_box_3.cs
4_box_4.cs
4_box_5.cs
4_class_definition_1.cs
4_compareto_1.cs
4_containment_example_1.cs
4_containment_example_2.cs
4_containment_example_3.cs
4_ctor_struct_1.cs
4_ctor_struct_2.cs
4_ctor_struct_3.cs
4_destructor_1.cs
4_destructor_2.cs
Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7032
Авторов
на СтудИзбе
260
Средний доход
с одного платного файла
Обучение Подробнее