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

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

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

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

многие разработчики оказываются разочарованными этим фактом. Существует масса случаев, когда было бы очень здорово иметь возможность упаковывать шаблоны С++ в статические библиотеки или ВЬЬ. К сожалению, зто невозможно. Именно поэтому весь код шаблонов С++ обычно располагается в заголовочных файлах. Это затрудняет защиту авторских прав на код шаблонов С++, поскольку, по сути, такой код должен предоставляться в открытом виде любому, кто в нем нуждается. Блестящим примером может служить библиотека ЭТЬ. Обратите внимание. что почти каждый кусочек реализации ЭТЬ находится в заголовочных файлах. Обобщения 311 С другой стороны, обобщения могут упаковываться в сборки и в таком виде потребляться позже. Вместо формирования во время компиляции конструируемые типы формируются во время выполнения, или, точнее говоря — во время ЛТ-компиляции. Во многих отношениях это делает их более гибкими.

Однако, как почти все в мире разработки, преимущества сопровождаются недостатками. Обобщения должны трактоваться во время проектирования существенно иначе, чем шаблоны С++. в чем вы убедитесь в конце настоящей главы. Ма заметку! Всякий раз, когда ЛТ-компилятор формирует закрытый тип, для домена приложения инициализируется новый тип. Естественно, зто накладывает требования на потребление памяти приложением, также известной под названием рабочего набора (шогй)пй зе)).

Как только тип инициализирован и загружен в домен приложения, отменить эту инициализацию и выгрузить его без одновременного разрушения домена приложения не удастся. В некоторых редких случаях может понадобиться учитывать эти ограничения, проектируя систему, использующую обобщения. Однако, вообще говоря, зти ограничения минимальны. Если обобщенный тип обьявляет массу статических полей, то создание множества закрытых типов на его основе может привести к существенной нагрузке на память, поскольку каждый закрытый тип получает собственную копию набора статических полей, Вдобавок, если эти закрытые типы применяются во многих доменах приложений, то каждый из них также получает свою копию набора статических полей. Эффективность и безопасность типов обобщений Вероятно, дополнительная эффективность при использовании типов значений в коллекциях — одно иэ наибольших преимуществ, которые несут с собой обобщения в ся.

поскольку обычный массив, основанный на Бузгеа. Актау, может содержать гетерогенные коллекции экземпляров, созданных из множества типов. до тех пор, пока он хранит ссылки на некоторый общий для них всех базовый тип вроде 5 уз сею. ОЬ1 еещ он обладает существенными недостатками. Рассмотрим следующий пример применения: рцбгас того Ботемеспоо) Аггзуъазс со1 ) ( Гогеасп( оЬБесс о Бп со1 ) ( 15оае1псегтзсе Бтасе = )15опе1псегГэсе) о; о.роэотеГЬ1пэ)); Поскольку все в СЬВ наследуется от Буэгеа.

ОЬБесш экземпляр Аггауь1зш переданный через переменную со1, может содержать просто невообразимую смесь разных сущностей. Некоторые из них могут и не реализовывать интерфейс 15опе1пгегуэсе. И тогда. как можно было ожидать, такой код сгенерирует исключение 1пча11оэзэгЕхсерсьоп. Однако разве плохо было бы заставить механизм контроля типов компилятора Ся выявлять такие вещи еще на этапе компиляции? Именно это и делают обобщения.

С помощью обобщений можно написать примерно такой код: риЬ11с тото Бопенеслог)Г 111зс<15опе1псегтзсе> со1 ) ) Гогезсп) 15оте1псеггасе гбасе гп со1 ) о.роэотеспйпч))Г ) Здесь метод принимает интерфейс 111зс<т>. Поскольку параметром типа является тип 15олге1псеггзсе, то список может хранить только объекты, относящиеся к типу 312 Глава 11 1Яогпетпгеггасе. И тут же компилятор получает возможность контролировать безопас- ность типов.

Нз звметку1 Повышение безопасности к типам во время компиляции — всегда хорошая вещь, потому что намного лучше перехватывать ошибки несоответствия типов во время компиляции, чем позке — во время выполнения. Ту же проблему можно решить и без использования обобщений, но это потребовало бы написания вручную класса, который служил бы той же цели, что и сконструированный тип ьавс<1яогпе1псеггасе>. поэтомудругая прелесть обобщений подобна шаблонам С++: они представляют собой оболочку для легкой специализации новых типов, построенных на их основе, таким образом. способствуя повторному использованию кода.

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

Приведенный выше пример показывает, как использовать обобщения для обеспечения безопасности типов. Однако в этом случае большой выигрыш в смысле эффективности не получится. Реальное повышение эффективности происходит тогда, когда аргумент-тип является типом значений. Вспомните.

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

Вдобавок вся эта упаковка увеличивает нагрузку на управляемую кучу. На помощь здесь приходят обобщения. В качестве примера скомпилируйте следующий код и затем аагрузите сборку в )ЬПАЗМ, чтобы сравнить сгенерированный код [Ь для каждого метода, принимающего экземпляр Ягас)п изапо Яувсевн пз1пд Яувкек.Со11есгаопэг пв1пд Яузсет.со11еск1опв.оепег1с; риЬ11с с1азз Епкгуговпк ( всасвс гоьс1 Иавп() ( ) риЬ11с чоас Мопоепег1с( ясаск вгзсх ) ( гогеась( оьяеск о 1п акаси ) ( 1пс пыпЬвг = (Епс) о; Сопво1в.нг1се11пе( пшпЬвг ); ) рцьавс чо1г( Оепег1с( якаск<1пк> всаск ) ( Гогеась( Ьпк ппкьег 1п акаси ) ( Сопзо1е.нгьсэьвпе( ппиьвг ); ) ) Обобщения 313 Обратите внимание, что код 1Ь, сгенерированный методом мопаепетгс, содержит, по меньшей мере. на 10 инструкций больше, чем обобщенная версия.

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

Дополнительно идентификаторы мест заполнения принято именовать, начиная с заглавной буквы Т, чтобы указать, что зто тнп. Это соглашение о назначении имен подобно принятому для обозначения интерфейсов, где имена начинаются с заглавной 1, что облегчает читабельность кода. Если определение обобщенного типа включает только один параметр типа, и понять его нетрудно, принято называть его т. Определения обобщенных типов и конструируемые типы Как упоминалось ранее, обобщенный тип — это скомпилированный тип, который не используется до тех пор, пока из него не будет создан закрытый тип. Необобщенный тип также известен как закрьипый пшп, а обобщенный тип называют опткрышьон пшпом Можно определить новый открытый тип через обобщенный, как показано в следующем примере: рсЬ11с с1ззз МуС1азз<Т> ртттате Т 1ппетОЬчестг ) риЬ11с с1азз Сопзсает<Т> ) ртгчзте МуС1азз< Зтаск<Т» сЬуг В этом случае определяется обобщенный тип сопзскет<т>, который содержит поле, основанное на другом обобщенном типе.

При объявлении типа поля Сопзокет<т>. оЬО тип МуС1азз< Зтаск<Т» остается открытым, пока кто-нибудь не объявит конструируемый тип на основе Сопзокет<Т>, тем самым создав закрытый тип для содержащегося в нем поля. Обобщенные классы и структуры До сих пор все приводимые примеры были обобщенными классами. Фактически, наиболее распространенные типы обобщенных объявлений, которые вы будете приме- 314 Глава 11 нять, будут обобщенными классами и структурами. Также до сих пор использовалась несколько небрежная терминология, но далее с ней будет наведено порядок. Объявления всех обобщенных типов структур и классов следуют тем же самым правилам, что и обычные структуры и классы.

Всякий раз, когда объявление класса содержит список параметров-типов, такой класс можно считать обобщенным типом. Аналогично любое вложенное объявление класса. будь оно обобщенным или нет, которое находится внутри контекста обобщенного типа, само является обобщенным. Это связано с тем, что полностью квалифицированное имя включенного типа требует аргумента типа, чтобы полностью специфицировать вложенный тип. Обобщенные типы перегружаются на основе количества аргументов в их списке параметров. Следующий пример иллюстрирует, что имеется в виду: рвь11с с1ввв Сопсвваег 1) рсь11с с1ввв Солсвтпег<Т> () рвь11с с1взз сопсвьпег<т, а> () Каждое из этих объявлений корректно в пределах одного и того же пространства имен.

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

Тип файла
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
Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7046
Авторов
на СтудИзбе
259
Средний доход
с одного платного файла
Обучение Подробнее