Частичные классы в C#

Классы, объявленные как partial (частичные), были нововведением С# 2.0. До сих пор было показано, как определять классы в единственном файле. Это было обязательно в С# 1.0. Тогда было невозможно разнести определение класса по нескольким файлам.

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

Обычно, когда вы работаете в IDE-среде, она пытается помочь, генерируя некоторый код. Например, при использовании средств ADO.NET мастер генерирует полезные классы-наследники Data Set. Классической проблемой при этом было ручное редактирование кода, сгенерированного инструментом.

Редактировать такой код всегда опасно, поскольку в любой момент при изменении входных параметров инструмент повторно сгенерирует код, в результате чего потеряются все изменения, проведенные вручную.

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

Во многих случаях это было противоестественным решением проблемы. К тому же часто код, сгенерированный этими инструментами, не был спроектирован с учетом наследования.

Теперь можно положиться на ключевое слово partial в определении класса, которое помещается непосредственно перед ключевым словом class. Это позволяет разносить определение класса по нескольким файлам. К каждому файлу, содержащему часть определения класса, предъявляется одно требование: в нем должно использоваться ключевое слово partial.

Кроме того, все части должны быть определены внутри одного и того же пространства имен, если они вообще объявляются внутри пространства имен.

Теперь, благодаря ключевому слову partial, код, сгенерированный инструментальными средствами, может находиться в отдельном файле, который не подвергается правке вручную, поэтому, когда инструмент повторно сгенерирует код, изменения теряться не будут.

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

Поэтому они должны сосуществовать вместе, как если бы они были объявлены и определены в одном файле.

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

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100