Разделяемые классы и методы в C# (ключевое слово partial)
В C# может использоваться такая возможность как разделяемые классы и методы. Суть разделяемого класса (или, как его ещё называют, частичного класса) состоит в том, что несколько частей одного и того же класса могут располагаться в разных файлах, но при компиляции все эти части будут собраны воедино. Рассмотрим основные моменты, связанные с использованием разделяемых классов и методов в C#.
Разделяемые классы
Для определения разделяемого класса используется ключевое слово partial , которое должно находиться непосредственно перед словом class . Например, создадим новое консольное приложение и добавим в него два файла со следующим содержимым:
Файл PartialClass_part1.cs:
Файл PartialClass_part2.cs:
В Visual Studio структура проекта будет выглядеть следующим образом:

Таким образом, мы объявили разделяемый класс с двумя методами. Теперь мы можем использовать этот класс, например, в методе Main следующим образом:
В консоли будет следующим вывод:
В каких случаях может потребоваться разделяемый класс
Microsoft выделяет следующие три варианта, когда может потребоваться использование разделяемых классов:
- При работе над большими проектами. Распределение класса между различными файлами позволяет нескольким программистам работать с ним одновременно.
- При работе с использованием автоматически создаваемого источника код можно добавлять в класс без повторного создания файла источника. Например, в Visual Studio этот подход используется при создании форм Windows Forms.
- При использовании генераторов источников для создания дополнительных функциональных возможностей в классе.
При этом следует отметить несколько моментов, связанных с использованием распределенных классов в C#:
- все части разделяемого класса должны использовать ключевое слово partial .
- для формирования окончательного типа все части класса должны быть доступны во время компиляции.
- все части должны иметь одинаковые модификаторы доступа, например public , private и т. д.
- если какая-либо из частей объявлена абстрактной ( abstract ), то весь тип будет считаться абстрактным.
- если какая-либо из частей объявлена запечатанной ( sealed ), то весь тип будет считаться запечатанным.
- если какая-либо из частей объявляет базовый тип, то весь тип будет наследовать данный класс.
Разделяемые методы
Суть разделяемого метода практически аналогична — в одной части разделяемого класса мы объявляем сигнатуру метода, а в другой части разделяемого класса — тело. Как и в случае с разделяемым классом, разделяемый метод должен начинаться с ключевого слова patrial . Например, создадим в нашем разделяемом классе разделяемый метод:
Файл PartialClass_part1.cs:
Файл PartialClass_part2.cs:
Теперь мы можем вызвать разделяемый метод в нашей программе:
Разделяемый метод в C# может не содержать реализации (тело метода). В этом случае метод и все вызовы метода удаляются во время компиляции. При этом, стоит отметить, что отсутствие реализации допускается только для следующих разделяемых методов:
- у него нет модификаторов доступа (включая private по умолчанию).
- он возвращает значение void .
- у него нет параметров out .
- у него нет ни одного из следующих модификаторов: virtual , override , sealed , new или extern .
Итого
Сегодня мы в общих чертах изучили, что из себя представляют разделяемые (частичные) классы и методы в C#. Разделяемые классы и методы могут содержаться в нескольких файлах и при компиляции собираться воедино.
Partial class c что это
Классы могут быть частичными. То есть мы можем иметь несколько файлов с определением одного и того же класса, и при компиляции все эти определения будут скомпилированы в одно.
Например, определим в проекте два файла с кодом. Не столь важно как эти файлы будут называться. Например, PersonBase.cs и PersonAdditional.cs. В одном из этих файлов (без разницы в каком именно) определим следующий класс:
А в другом файле определим следующий класс:
Таким образом, два файла в проекте содержит определение одного и того же класса Person, которые содержат два разных метода. И оба определенных здесь класса являются частичными. Для этого они определяются с ключевым словом partial .

Затем мы можем использовать все методы класса Person:
Частичные методы
Частичные классы могут содержать частичные методы. Такие методы также опреляются с ключевым словом partial . Причем определение частичного метода без тела метода находится в одном частичном классе, а реализация этого же метода — в другом частичном классе.
Например, изменим выше определенные классы Person. Первый класс:
В первом классе определен метод Read() . Причем на момент определения первого класса неизвестно, что представляет собой этот метод, какие действия он будет выполнять. Тем не менее мы знаем список его параметров и можем вызвать в первом классе.
Второй класс уже непосредственно определяет тело метода Read() .
Стоит отметить, что по умолчанию к частичным методам применяется ряд ограничений:
Они не могут иметь модификаторы доступа
Они имеют тип void
Они не могут иметь out-параметры
Они не могут иметь модификаторы virtual, override, sealed, new или extern
Если же они не соответствуют какому-то из этих ограничений, то для них должна быть предоставлена реализация. Как, например, в следующем примере частичные методы применяют модификатор public :
Разделяемые классы и методы в C#
Существует много ситуаций, когда вам может понадобиться разделить определение класса. Допустим, вы работаете над большим проектом, в котором задействовано множество разработчиков и программистов — всем нужно работать над одним классом одновременно. В таких случаях нам будут полезны разделяемые классы.
Разделяемые классы
В языке C# можно разделить определение класса между двумя или более исходными файлами. Каждый файл с исходным кодом содержит часть определения класса, а во время компиляции все части объединяются. Чтобы разделить определение класса, нужно использовать ключевое слово partial .
Пример 1. Выводим высоту и ширину
Мы напишем новый проект — HeightWeightInfo . Результат его работы — вывод в консоль высоты и ширины.
Внутри проекта содержится файл File1.cs с разделенным классом Record . В нем определены две целочисленные переменные — h и w . Также внутри реализован метод/конструктор Record , который присваивает значения переменным h и w .
Во втором файле File2.cs содержится точно такой же класс Record . Внутри него содержится лишь один метод — PrintRecord . Этот метод выводит в консоль значения переменных h и w .
В проекте метод main выглядит следующим образом:
В нем мы можем увидеть объект класса Record — myRecord . В качестве параметров поступают значения h и w , определенные в File1.cs — 10 и 15 соответственно.
Метод PrintRecord вызывается объектом myRecord , который объявлен в File2.cs .
Как видите, ключевое слово keyword помогает объединить атрибуты класса, объявленного в разных файлах, в один класс.
Когда partial класс может быть полезен:
- Вы работаете с большим проектом, в котором задействовано более одного разработчика. С помощью класса partial вы можете вместе работать с одним классом.
- Класс можно дополнять или редактировать без повторного создания исходного файла, которые автоматически генерируются IDE.
Что нужно запомнить о partial-классах
Ключевое слово partial указывает на то, что другие части класса могут объявлены в пространстве имен. Если мы хотим создать partial-класс, то необходимо использование ключевого слова partial . Все части класса должны быть принадлежать одному пространству имен и доступны во время компиляции в финальный тип. У всех переменных должен быть один и тот же модификатор доступа — например, private , public и т. д.
- Если какая-либо часть класса объявлена как abstract , то и финальный тип также считается abstract .
- Если какая-либо часть класса объявлена как sealed , то и финальный тип также считается sealed .
- Если в какой-либо части класса объявлен базовый класс, то финальный тип наследует этот класс.
- Любой член класса, объявленный в partial-классе, доступен остальным частям класса.
- Все части partial-класса должны содержаться в одном и том же пространстве имен.
Примечание. Модификатор partial недоступен в объявлениях делегатов и перечислений.
Разделяемые методы
Внутри partial-классов могут содержатся partial-методы. Одна из частей класса содержит сигнатуру метода, остальная часть его реализации может содержаться в той же части класса или другой. Если реализация не предоставлена, то метод и все его вызовы удаляются во время компиляции.
Пример 3. Рассматривает методы partial-класса Car
В качестве примера возьмем partial-класс Car , объявленный в File1.cs . В нем содержится три метода: InitializeCar() , BuildRim() и BuildWheels() . Среди них объявлен partial-класс InitializeCar .
Также в нашем проекте есть файл file2.cs . В нем содержится два метода: BuildEngine и InitializeCar . Метод Initialize — partial-метод, который был определен еще в file1.cs .