Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 26
Текст из файла (страница 26)
Теперь, благодаря ключевому слову рагС1а1, код, сгенерированный инструментальными средствами, может находиться в отдельном файле, который не подвергается правке вручную, поэтому, когда инструмент повторно сгенерирует код, изменения теряться не будут. Вы должны кое-что знать о процессе, через который проходит компилятор при сборке частичного класса в одно целое. Поскольку требуется скомпилировать все части класса вместе, компилятор должен суметь их найти. В основном все члены и прочие конструкции класса сливаются вместе посредством операции объединения.
Поэтому они должны сосуществовать вместе, как если бы они были объявлены и определены в одном файле. Списки базовых интерфейсов объединяются вместе. Из-за того, что каждый класс может иметь максимум один базовый класс, то все части класса. разнесенного по нескольким файлам, должны ссылаться на один и тот же базовый класс. Если не обращать внимания на эти совершенно очевидные ограничения, то частичные классы являются весьма полезным добавлением к языку С№.
Частичные методы В С№ 3.0 ключевое слово рагг№а1 помимо частичных классов можно применять и для методов. Частичный метод — это просто метод, сигнатура которого объявляется в одной части частичного класса, а сам метод определяется в другой его части. Подобно частичным классам, частичные методы особенно полезны при работе с кодом, созданным мастерами и генераторами кода. Изящество частичных методов состоит в том, что если генератор создает объявление частичного метода в одной части класса, а вы не реализуете этот метод в другой его части, то такой метод просто не включается в результирующий собранный класс. Более того. любой код в сгенерированной части, вызывающий такой частичный метод, ничего не разрушит.
Этот метод вообще не будет вызываться. На частичные методы накладываются некоторые ограничения, необходимые для обеспечения упомянутого поведения. ° Частичные методы должны иметь тип возврата чо1ст. ° Частичные методы не могут принимать параметры оэг, но допускают параметры геЕ ° Частичные методы не могут быть ехгегпа1. ° Частичные методы не могут быть помечены как т№гкса1 и не могут быть декорированы модификаторами доступа, поскольку неявно они являются приватными.
° Частичные методы не могут быть помечены как зсас№с или сазаке'. ° Частичные методы могут быть обобщенными и могут быть декорированы ограниче- ниями, хотя повторение ограничений в объявлении реализации не обязательно. ° Частичные методы не могут вызываться делегатами, поскольку существование частичных методов в конечном скомпилированном коде не гарантируется. ' Тема написания небезопасного (ипэате) кода на С№ выходит за рамки настоящей книги, За дополнительной информацией обращайтесь к документации МЯЭттт. 94 Глава 4 Имея в виду все эти ограничения, давайте рассмотрим краткий пример частичных методов. Представим один частичный класс, который в данном примере является результатом работы некоторого генератора кода: роЬ11с рвггяа1 с1ввв Рзгаяопгсе ( /! Некоторые полезные методы рвггаз1 чогб КеяегЯоогсе(); ) Предположим, что этот класс РагаБопгсе, созданный генератором, представляет некоторую часть лежащего в основе хранилища данных, которое для удовлетворения требований дизайна должно иметь возможность периодически сбрасываться.
Вдобавок предположим, что шаги, необходимые для этого сброса источника данных, известны только тому, кто дополнит и использует потом этот частичный класс и реализует частичный метод. С учетом сказанного, возможное дополнение этого частичного класса его потребителем может выглядеть следующим образом: овады Буягеш) роЬ11с рвггьз1 с1ввв Рзгаяоогсе ( рвггга1 чоаб Кевегяоогсе() ( Сопяо1е.иг1ге11пе( "Источник сброшен" ) роваас чогб Кеяег() ( кеяегяоогсе()) роЬ11с с1аяв Рагггв1негпобя ( ягвгяс чо1б Нвап() ( Рягвяоогсе бв = пен Рагяяопгсе(); бя.кевег(); ) Как видите, чтобы в на1п можно было сбрасывать экземпляры РагаБоигсе, был добавлен общедоступный метод по имени Ревег. Это связано с тем, что метод КевегЯопгсе ненвно является приватным. Если вы просмотрите полученный в результате исполняемый код с помощью 1ЬВАВМ, то увидите в нем приватный метод РагаЯопгсе. кевегБопгсе, а если заглянете в Рагаяопгсе.
кевег, то увидите там вызов кеяегяопгсе. Если закомментировать или удалить частичную реализацию КеяегЯопгсе и перекомпилировать код, то 1ЬВАВМ покажет, что метод РагаБопгсе. КеяегЯопгсе вообще отсутствует, а вызов КеяегБопгсе внутри метода Кеяег просто удален. Статические классы В С() 2.0 появился новый модификатор классов, позволяющий указывать, что данный класс — не что иное, как коллекция статических членов, и создавать его экземпляры не разрешено.
Для этого к классу должен быть применен модификатор вгаггс. В таком случае на класс накладываются следующие ограничения. ° Класс не может наследоваться ни от чего кроме Я у я геш. ОЬ) есг, и даже если этот базовый тип не указан, наследование от него подразумевается.
° Класс не может использоваться в качестве базового для других классов. Классы, структуры и объекты 95 ° Класс может содержать только статические члены, которые могут быть общедоступными или приватными. Однако они не могут помечаться как ргогессес( или ргосессес( ъпсегпа1, поскольку класс не может служить базовым.
° Класс не может иметь никаких операций, поскольку, по причине невозможности создания экземпляров класса, их определение не имеет смысла. Несмотря на то что весь класс помечен как ясасас, все его индивидуальные члены также помечаются с помощью ягас1с. Хотя компилятору было бы просто предположить, что любой член внутри статического класса также является статическим, это внесло бы излишнюю сложность в без того сложный компилятор. Если вы примените модификатор в касас к вложенному классу, он также будет статическим, как и содержащий его класс, а вложенные классы, не снабженные модификатором я с а гас.
допускают создание их экземпляров. На заметку! По сути, объявление класса ягзгтс — Этс то жэ СамОЕ, чтО Объявление его явв1вс и эъяггвсг одновременно, но компилятор не позволит сделать это. Тем не менее, если просмотреть код Ц сгенерированный длл статического класса, легко заметить, что именно это компилятор и делает — те. статический класс е коде (Ь декорирован модификаторами аьвтгаст и веа1егъ Ниже приведен пример статического класса: овалу Яувсев; риъъъс ясак(с с1аяя ЯгастсС1ввв риъъъс ягвгтс но1о Ооыоги() ( ++са11Соэпсп Сопво1е. Нггсеъапе ( "Ясасъсс1аяв. ооиоги ()" ) ) рсЬ11с с1звв НевгеоС1авв ( риътьс МезсеОС1аяя() ( Сопво1е.нгътеьъпе( "Неясет(01аяя.ыезгеОС1авя()" ) ) ргьчаге вгягъс 1опо са11соипг = 0; роЬ11с вгзс1с 1опо Са11Соопг ( оес ( гесогп са11Соопъч ) ) роЬ11с ясзс1с с1аяя ЯпсгуРоапс ( всасъс чоъс Маъп() ( ЯсвсъсС1авв.ооиоги()) О так поступать нельзя! О ЯгагъсС1вяв оЬ) = лен ЯсасьсС1явз() ЯсасьсС1авя.ыевгеОС1звв пеясед = пен ЯтасьсС1авв.неясеОС1аяя(); Сопво1в.ыгъсеъгпе( "Са11Соипг = (О)", ЯсасьсС1авв.Са11Соопг ); Тип ЯсагьсС1аяя содержит метод, поле, свойство и вложенный класс.
Обратите внимание, что поскольку ыея се с(с 1 а я я не объявлен как я т атас, можно создавать его экземпляры. К тому же, из-эа того, что класс япггуроапг просто содержит метод ма1п, он также помечен как ягасъс, чтобы предотвратить непреднамеренное создание его экземпляров. 96 Глава ч Статические классы удобны, когда необходим логический механизм организации набора методов. Примером статического класса из библиотеки базовых классов (Вазе С!аэз ЫЬгагу) может служить знаменитый класс 5 у все.
С оп з о1е. Он поддерживает методы. свойства и события, которые все являются статическими, так как в один и тот же момент времени к процессу может быть присоединена только одна консоль. Шаблон 81пд1е1оп Возможно, наиболее популярным шаблоном проектирования является 8!пц!е1оп (Одиночка), который обычно моделирует ситуацию, когда можно иметь только один экземпляр класса в единицу времени. Исторически сложилось так, что шаблон 8!пц!е1оп реализуется с помощью приватного конструктора и статического метода под названием вроде Бег1пзсапсе, который возвращает ссылку на единственный допустимый работающий экземпляр. Хотя данный подход можно применять в СЛ, все же статический класс предлагает лучшее средство реализации шаблона 8!пц!е!оп, что доказывает пример применения Бузгелт.











