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

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

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

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

Хгксе1 1пе ( "А. 1птгх () " ) и гегогп 1; ) рг1оасе вгаггс 1пс 1п1гу() ( Соггво1е. Хгатеь).пе ( "А. 1птт т () " гетсгп 2г ргтозге вгзсгс тпс 1пгсА() ( Сопво1е. Хг1сет гпе ( "А. 1п1ГА () " ) т геспгп Зт ) 120 Глава 4 ргачаге ясагтс 1пс 1п1СВ() ( Сопяо1е.вгусеъапе( "А.1птСВ()" гегпгп 4; гпс у = 1п1гу(); 1п1СХ () ) ягаГ1с 1пс а = 1птГА(); ясас1с гпс Ь = 1пгГВ(); рг1наге рг1наге рг1наге рггнаге рпЬ11с с1аяя Впггувотпг ( ягаг1с но1г) Маап () ( А а = печ А(); ) В класс добавлен статический конструктор, вызов которого, если случится. то должен быть отражен в выводе. Вот что получилось в результате; А.1п1ГА() А, 1птГВ ( ) ясагтс А::А() А.1птсу () А тп1СХ() Разумеется, статические конструкторы были вызваны перед созданием экземпляра класса.

Однако обратите внимание на последовательность вызовов. Инициализаторы статических полей выполняются перед выполнением тела статического конструктора. Это гарантирует правильную инициализацию полей перед тем. как произойдет обращение к ним из тела статического конструктора. Вызов инициализатора типа (реализованного с использованием синтаксиса статического конструктора) перед обращением к любому из членов этого типа является стандартным поведением СЬК. Здесь имеется в виду, что инициализаторы типа будут выполняться перед тем, как код обратится к полю или методу класса или перед созданием объекта этого класса.

Чтобы несколько ослабить строгость этих правил, можно применить определенный в СЬК атрибут метаданных Ьеуоге11е1г(1п1С. В отсутствие атрибута Ьегогег1е1г)1п11 среда СЬК вызывает инициализатор типа перед тем, как будет затронут любой член класса. С помощью атрибута)яе1оге11е1г(1п11 среде СЬК разрешается отложить инициализацию типа до момента. непосредственно предшествующего первому обращению к статическому полю, но не раныпе. Это значит, что если для класса установлен атрибут Ьегогеу).е1сапгг, то можно вызывать конструкторы экземпляра и методы, не требуя предварительного выполнения инициализатора. Но как только кто-нибудь попытается обратиться к статическому полю класса, СЬЛ перед этим вызовет ннициализатор типа.

Имейте в виду, что атрибут Ье1оге11е1г(1п11 разрешает СЬК отложить инициализацию типа на более позднее время, но СЬК все равно может инициализировать тип задолго до первого обращения к статическому полю. Компилятор СЗ устанавливает атрибут Ьегогег1е1г)1п11 для всех классов, в которых специально не определены статические конструкторы. Чтобы убедиться в этом. просмотрите в 1ЬРАЗМ сгенерированный код 1Ь для предыдущих двух примеров. В примере нз предыдущего раздела, где не был определен статический конструктор, метаданные класса А выглядят следующим образом: Классы, структуры и объекты 121 .с1аяя рпЬ11с вико вова Ьетоге11е1О1п№С А ехтепс)в (твсог11Ь]Яувгеы.ОЬ)еся ( ) // епс) от с1авя А Метаданные класса А из примера в настоящем разделе выглядят иначе: .с1явв рпЬ11с впко зпв1 А ехкепт)в (ивсог11Ь)зувкеи.ОЬ)ест ( // епт) от с1авв А Такое поведение компилятора С№ имеет большой смысл.

При явном определении инициализатора типа обычно необходимо гарантировать, что он будет выполнен перед использованием чего-либо из класса или перед созданием любого экземпляра этого класса. Однако если явный инициализатор типа не предусмотрен, но есть инициализаторы статических полей, то компилятор С№ создаст такой инициализатор типа, который просто инициализирует все статические поля. Поскольку пользовательский код для инициализатора типа не предоставлен, компилятор С№ может позволить классу отложить инициализацию статического поля до момента первого обращения к этому полю. После обсуждения атрибута Ьеуогетуе1Н№п№С вы должны отметить одну важную вещь.

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

В противном случае нет никаких гарантий, что код со сторонним эффектом будет запущен до создания экземпляра класса. 122 Глава 4 Конструктор экземпляра и порядок создания Конструкторы экземпляра следуют многим тем же правилам, что и статические конструкторы, за исюпочением того, что они более гибкие и более мощные, поэтому подчиняются еще и нескольким дополнительным собственным правилам. Давайте рассмотрим зти правила.

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

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

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

Именно это компилятор пытается сделать с классом в. Однако проблема в том, что поскольку класс А не имеет явно определенного конструктора экземпляра, то компилятор не генерирует и нонструктор по умолчанию для класса А. Поэтому в классе А нет доступного конструктора по умолчанию, чтобы он мог вызвать предоставленный компилятором конструктор по умолчанию класса В. И здесь мы сталкиваемся с еще одним нюансом, связанным с наследованием. Чтобы приведенный пример компилировался, необходимо либо явно представить конструктор по умолчанию для класса А, либо класс В должен иметь явный конструктор. Теперь рассмотрим пример, демонстрирующий порядок событий, происходящих во время инициализации экземпляра: Классы, структуры и объекты 123 пвтпс Вузсее! с1авв Вазе рпЬ11с Вазе( гпс х ) ( Сопво1е.нг1кеъ1пе( "Вазе.Вазе(1пк)" )! гпгв.х = х! рггчасе всас1с 1пс 1пгГХ() сопзо1е.югггеьъпе( "Вазе.1пггх()" )! гекпгп 1! ) рпвъгс гпс х = 1п1ГХ(); ) с1азз Оеггчек) ! Вазе ( рпЬ11с Оеггчес( 1пс а ) кЬазе( а ) ( Сопво1е.нгтсеьтпе( "Оег1чет).Оег1чео(гпс)" )! Гиъв.а = а; ) рпбъгс Оегтчео( гпс а, 1пс Ь ) Гбъв( а ) ( Сопзо1е.нг1сеътпе( "Оеггчео.оеггчео(апс, апк)" )! Гиъз.а = а! гбъз.ь = Ь! ) ргтчасе всас1с гпс 1пгГА() ( Сопво1е.нггтеь1пе( "Оег1чек(.1пгГА()" ); геспгп 3! ) рггчасе всас1с 1пк 1пгГВ() ( Сопво1е.иг1сеъвпе( "Оег1чег(.1пгГВ ()" ) ! гегпгп 4! ) рпЬ1гс гпс а = 1пъГА(); рпЬ1гс 1пс Ь = 1пъГВ()! рпЬ11с с1авв Впсгурокпс вгасъс чогб Магп() ( Оегъчео Ь = пеи Оег1чес( 1, 2 ) Прежде чем приступить к детальному описанию порядка событий, взглянем на вывод этого кода: Оег1чеО.1пкгА() Оег1чет).

1п1ГВ() Вазе.1пгГХ() Вазе.Вазе(1пг) Оег1чек).Оегтчет((1пс) Оег1чек(.Оег1чео(1пс, гпс) 124 Глава 4 Можете ли вы объяснить, почему порядок именно таков, как показано? На первый взгляд он может показаться довольно запутанным, поэтому давайте разберемся, что здесь происходит. В первой строке метода маьп создается новый экземпляр класса Вег1пес.

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

Конструктор рег1чег), принимающий один параметр 1пп, также имеет список инициализации, но использует ключевое слово Ьаве. тем самым вызывая конструктор базового класса Вазе, который принимает один параметр 1пп. Однако если конструктор имеет инициализатор, использующий ключевое слово Ьаве, то прежде чем передать управление конструктору базового класса, такой конструктор вызовет иницнализаторы полей, определенные в классе.

Как вы помните, порядок инициализаторов определяется порядком указания полей в определении класса. Такое поведение объясняет первые две строки в выводе. Вывод демонстрирует, что инициализаторы полей в Рег1пес) вызываются раньше инициализаторов Вазе. После выполнения инициализаторов рег1пег) управление передается конструктору Вазе, принимающему один параметр 1пп.

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