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

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

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

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

Однако такой сокращенный синтаксис требует, чтобы поля яре11СЬес)тегтезлт уже существовали перед установкой свойств. те. данные поля нс должны быть пи11. В связи с этим пришлось изменить определение ГеагигеОечрв1г, чтобы создать содержащиеся экземпляры Епр1оуее в точке инициализации. 108 Глава 4 На заметку) Если вы не инициализируете поля, раскрываемые свойствами, во время инициализации объекта, а затем позже напишете код, инициализирующий экземпляры этих объектов с использованием показанного выше сокращенного синтаксиса, то во время выполнения столкнетесь с неприятным сюрпризом.

Ожидается, что в таких случаях код должен сгенерировать исключение нс11пегегепсекхсер11оп (нулевая ссылка]. к сожалению, компилятор не может обнаружить эту потенциальную проблему во время компиляции. Поэтому при использовании сокращенного синтаксиса необходимо проявляться крайнюю осторожность. Например, если этот синтаксис применяется для инициализации экземпляров объектов, которые писали не вы, то нужно быть еще осторожней, потому что если не просмотреть реализацию этого чужого класса в )ЬОАБМ или Не(!ес)ог, то не будет никакой воэможности узнать, инициализируются поля во время инициализации обьекта или нет.

Упаковка и распаковка Теперь давайте рассмотрим упаковку и распаковку. Все типы внутри СЬН относятся к двум категориям: ссылочные типы (объекты) и типы значений (значения). Объекты определяются с помощью классов, а значения — с помощью структур. Между этими двумя группами существует четкое разделение. Объекты находятся в памяти кучи, управляемой сборщиком мусора. Значения обычно располагаются в пространстве временного хранения, таком как стек. Единственное достойное упоминания исключение, о котором уже говорилось, состоит в том, что тип значения может находиться в куче, если он хранится в виде поля объекта.

Однако он не является автономным, и сборщик мусора не контролирует время его существования напрямую. Рассмотрим следующий код: риЬ11с с1ззз Епггуро1пт ( згагтс то1г) Рг1пг( оЬ)ест оЪ) ) ( Бузгеи.сопзо1е.иг№геьгле( "(0)", оь).тозгг1по() ) зкас1с тока Маап() ( 1пт х = 42г Рг1пк( х )! ! ) Все выглядит достаточно просто.

В мази имеется Тпщ который в С№ является псевдонимом для Бузгегк.1пс32 и представляет собой тип значения. Переменную х можно было бы также объявить как относящуюся к типу Бузсегз. 1пь32. Место, выделенное для х, находится в локальном стеке. Затем переменная х передаете в виде параметра методу Рг1пщ Метод Ргт.пт. принимает ссылку на оЬ3 есг и просто посылает результат вызова ТЬБСгапд на этом объекте на консоль. Давайте проанализируем детали. Рг1пс принимает ссылку на расположенный в куче объект. Но вы передаете методу тип значения. Что же здесь происходит? Как такое возможно? Ключ лежит в концепции, называемой упаковкой (Ьох)па).

В точке, где определяется тип значения, СЬН создает во время выполнения класс-оболочку для помещения в него копии типа значения. Экземпляры этой оболочки находятся в куче и обычно называются упаковочными объектами. Это способ, которым СЬН преодолевает зазор между типами значений и ссылочными типами. Фактически, если с помощью )ЬРАЗМ заглянуть в код 1Ь, сгенерированный для метода Ма1п, можно увидеть там следующее; Классы, структуры и объекты 109 .ыеспос( рг1часе Ьгс(еЪуя10 ягастс чогб Ма1п () с11 аапастес( ( .епггуро[пг ссг' Оос(е я1яе 15 (Охс) .ыахягвсх 1 .1оса1я Хгтс (Хпс32 Ч 0) 11 0000с 1бс.14.я 42 11 0002с яг1ос.О 11 0003: 1с(1ос.О ХЬ 0004: Ьотс [авсогХХЬ)аувсеа.тпа32 11 0009с св11 чо1с( ЕпсгУРоъпгс:Ргтпс(оЬОеск) ХЬ 000е: гег ) с'г' епс( ос иегпос( ЕпсгуРо1псс:Маго Обратите внимание на И инструкцию Ьох, которая выполняет операцию упаковки перед вызовом метода Рг).пс.

При этом создается объект, показанный на рис. 4.2. Интерфейсы, поддерживаемые упакованным типом значений Находящийся в куче объект, созданный СЫ, который действует как упаковочный объект Тип значений, располагаемый в локальном стеке Упакованный тип значенийв копия оригинала Рис. 4.2. Результат операции упаковки На рис. 4.2 отображено действие копирования типа значения в упаковочный объект, находящийся в куче.

Упаковочный объект ведет себя подобно любому другому ссылочному типу в СЬК. К тому же упаковочный тип реализует интерфейсы содержащегося типа значений. Упаковочный тип — это тип класса, внутренне сгенерированный виртуальной исполняющей системой СЬК в точке определения содержащегося типа значений. Затем СЬК использует этот внутренний тип класса при выполнении необходимых операций упаковки. Наиболее важный момент, касающийся упаковки, который следует иметь в виду— это то, что упакованное значение является копией оригинала. Поэтому любые изменения значения внутри упаковки не распространяются обратно на исходное значение. Например, рассмотрим следующую небольшую модификацию предыдущего кода: рсЬ11с с1вяя ЕпсгуРо1пс ( всвскс чокй Рг[пГАпдноп1су( оЬОесг оЬО ( ЗУЯГеи.Сопво1е.кг[сеЬ1пв( "(О)", оЬО.Тозсгтпд() ) Хпс х = (1пс) оЬ34 х=214 ) ясасгс чо1с( Мати() ( 1пг х = 424 Рг1пглпсноб[гу( х ) г РгспГАпснобтгу( х )г 110 Глава 4 Вывод этого кода может удвэитвк 4г 4г Фактически первоначальное значение переменной х, объявленной и инициализированной в мв).п, никогда не изменяется.

Когда оно передается методу Рг1пгАпбиоб1Еу, то упаковывается, поскольку метод РгбпсАгпй(оббеу принимает тип оЬ]есс в качестве параметра. Несмотря на то что метод Рг1псАпбмоб1 еу принимает ссылку на объект, который можно модифицировать, принятый им объект является упаковочным и содержит копию исходного значения. В методе РгбпСАпс]МобЕЕу также вводится другая операция. называемая распаковкой (цпЬох(пл].

Поскольку значение упаковывается внутри экземпляра объекта в куче, изменить его нельзя, так как методы, поддерживаемые объектом— это только методы, реализуемые яув Сев. ОЬ3 есг. Формально он также поддерживает те же самые интерфейсы. что и яувсеа. 1пс32. Поэтому необходим какой-то способ получения значения из упаковки. В С» зто можно сделать синтаксически — с помощью приведения. Обратите внимание, что выполняется приведение экземпляра объекта обратно к 1пг, а компилятор достаточно интеллектуален, чтобы понять, что на самом деле необходимо распаковать тип значения, и применяет П инструкцию ипЬох, что видно в следующем коде (Ь метода Рг1пГАпбиобЕЕу: .тегпоб Рггчяяе ЬьбеЬуябд ягясбс човб РгбпСАпс)иоб1Еу(оЬ3есС оЬ)) с11 авпядеб ( // Собе в).яе 28 (Ох1с) .тахвгас)с 2 .1ося1в Епбс (Епе32 Ч 0) 1Ь 0000: 1бягг "(0)" 1Ь 0005: 1бягд.О 1Ь 0006: ся11чбгг 1пвяапсе вггьпд (тясог11Ь]Яувсеа.ОЬ)есс::тоЯСгбпд() 1Ь ОООЬ: са11 чобб (твсог11Ь]яувгеа.сопво1ессиг1геЬ1пе(всг1пд, оЬ]есг) 1Ь 0010: 1бвгд.О 1Ь 0011: апьах (вваах11Ь]вуввав.хпЕЗг 1Ь 0016: 1бгпб.14 1Ь 0017: ве1ос.О 11 0018с 1бс.14.я 21 1Ь 001вс ве1ос.О 1Ь 001Ь: гег ) // епб оЕ аеяпоб ЯпггуРобпг:сРггпСАпбМобЕЕу Теперь необходимо внести ясность относительно того, что происходит во время распаковки в С».

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

Что еще хуже, так это то, что две копии 1 ос создаются между моментом инициации вызова Рг1пслпбмоб1Еу и моментом манипулирования этим 1пс в методе. Первая копия помещается в упаковку. Вторая копия создается, когда упакованное значение копируется из упаковки. Формально значение, содержащееся в упаковке, можно модифицировать.

Однако это должно делаться через интерфейс. Сгенерированная во время выполнения упаковка. содержащая значение, также реализует обычный для типа значения интерфейс и передает вызовы содержащемуся значению. В конечном счете, можно было бы поступить следующим образом: Классы, структуры н объекты 111 риЪ11с Тпгеггасе 1МосасумуЧа1ие ( 'пг х ( дег; вест ) ) ривагс вггисг МуЧа1ие: 1Мот(16уМуЧа1ие ( риЬ1).с 1пг хт риЬ11с апг Х ( дег ( гегигп х; вег ( х = ча1ие) риЬ11с очегг1т(е вгггпд Тоаггапд() ( Яувгев.Техт.эгггпдви11оег оигриг = пем яувгет.тенг.ягггпдВи11г(ег()т оигриг.лррепт)рогааг( "(О]", х )т гегигп оигриг.тоэггапд()т ! риЪ11с с1авв Епггуроапг ( вгагас чо14) Маап() ( // создать значение МуЧа1ие вуча1 = пем МуЧа1ие()т муча1.х = 1234 // упаковать его оптесг оЬб = вуча1) Яувгем.сопво1е.нггге11пе( "(О)", оЬ1.Тоэггапд() )т // модифицировать содержимое упаковки 1носгсуМуча1ие 16асе = (1Мок(16уМуча1ие) оЬ3; ТЕасе.Х = 456; Яувгев.сопзо1е.ыгагесапе( "(О)", оьб.тоэггапд() )т // распаковать и посмотреть, что получилось МуЧа1ие пемчв1 = (Муча1ие) оЪ3; яувгеи.Сопво1е.нгагегапе( "(О)", пемча1.Тоегггпд() )т Запуск этого кода на выполнение дает следующий вывод: 123 456 456 112 Глава 4 Как и ожндалось, значение внутри упаковки можно модифицировать.

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