C# Partial Classes Explained
In this article I’m going to explain what partial classes are and why do we need partial classes in C#.
What is Partial Class
Partial class is when one set of methods and properties, of the class, are defined in one .cs file, another set of methods and properties are defined in another file etc. Of course all this this suppose to happen in scope of one namespace.
When we create an instance of the partial class, we get all methods and properties from all locations of our class.
A code sample from above demonstrates how class is defined as partial and it’s methods are distributed in two different files.
After creating an instance of our partial class we’ve got access to all methods from both files.
As you can see, from the screenshot above, if we right click at line 7 where it says “new PartialClassSample()” and choose “Go To Definition” (or simply hit F12), we’ll see a window which tells us, that implementation of this class is distributed between two files and shows both of them.
Fully implemented project, with all code samples is available for download from the link below:
https://github.com/MichaelSamteladze/CSharpPartialClassesExplained
Why Do We Need Partial Classes in C#
Long time ago when Windows Forms has been introduced to developers, we have been gifted a perfect development GUI with collection of ready to go components. With a simple mouse drag/drop action we can easily build perfectly designed form, position and resize our components, set font sizes and colors without even writing a single line of code.
Code writing process starts when we begin to interact with our components: write logic for button click, dropdown change, etc.
Few drag/drop actions to create a Button and a TextBox, few lines of code in Form1.cs file and here we go fully functional up and running form.
But how do you think we’ve got an access to MyTextbox variable? Where is it defined? and in general who is responsible for positioning our Button and TextBox in the middle of form?
The answer to all these questions sits in Form1.Designer.cs file.
Visual studio generates all that heavy duty code for us, that is responsible for drawing and presenting our components on the form.
As you can see, from the image below, there is also a code region, which says that all code inside in auto generated by visual studio.
Any time we add new component, change component position, color or font size, this code is being auto updated for us.
These designer auto generated code and our custom written code, for handling button clicks and other actions, suppose to work in symbiosis as one whole, because in the end of the day, our form is presented as one C# class Form1 with properties, methods and events.
In order to avoid any interruptions, where we don’t overwrite designer code, and designer doesn’t make any change in ours we need to have some sort of separation.
This is where PARTIAL CLASSES step in
Our code is wrapped in partial class Form1,designer code is also wrapped in partial class Form1 both files are combined and presented as one class by visual studio.
This technique is also used for Entity Framework and LINQ to SQL auto generated classes for separating studio generated code from ours.
Partial class c что это
Классы могут быть частичными. То есть мы можем иметь несколько файлов с определением одного и того же класса, и при компиляции все эти определения будут скомпилированы в одно.
Например, определим в проекте два файла с кодом. Не столь важно как эти файлы будут называться. Например, PersonBase.cs и PersonAdditional.cs. В одном из этих файлов (без разницы в каком именно) определим следующий класс:
А в другом файле определим следующий класс:
Таким образом, два файла в проекте содержит определение одного и того же класса Person, которые содержат два разных метода. И оба определенных здесь класса являются частичными. Для этого они определяются с ключевым словом partial .
Затем мы можем использовать все методы класса Person:
Частичные методы
Частичные классы могут содержать частичные методы. Такие методы также опреляются с ключевым словом partial . Причем определение частичного метода без тела метода находится в одном частичном классе, а реализация этого же метода — в другом частичном классе.
Например, изменим выше определенные классы Person. Первый класс:
В первом классе определен метод Read() . Причем на момент определения первого класса неизвестно, что представляет собой этот метод, какие действия он будет выполнять. Тем не менее мы знаем список его параметров и можем вызвать в первом классе.
Второй класс уже непосредственно определяет тело метода Read() .
Стоит отметить, что по умолчанию к частичным методам применяется ряд ограничений:
Они не могут иметь модификаторы доступа
Они имеют тип void
Они не могут иметь out-параметры
Они не могут иметь модификаторы virtual, override, sealed, new или extern
Если же они не соответствуют какому-то из этих ограничений, то для них должна быть предоставлена реализация. Как, например, в следующем примере частичные методы применяют модификатор public :
Partial class c что это
A partial class is a special feature of C#. It provides a special ability to implement the functionality of a single class into multiple files and all these files are combined into a single class file when the application is compiled. A partial class is created by using a partial keyword. This keyword is also useful to split the functionality of methods, interfaces, or structure into multiple files.
Syntax :
Important points:
- When you want to chop the functionality of the class, method, interface, or structure into multiple files, then you should use partial keyword and all the files are mandatory to be available at compile time for creating the final file.
- The partial modifier can only present instantly before the keywords like struct, class, and interface.
- Every part of the partial class definition should be in the same assembly and namespace, but you can use a different source file name.
- Every part of the partial class definition should have the same accessibility as private, protected, etc.
- If any part of the partial class is declared as an abstract, sealed, or base, then the whole class is declared of the same type.
- The user is also allowed to use nested partial types.
- Dissimilar parts may have dissimilar base types, but the final type must inherit all the base types.
Example: Here, we are taking a class named Geeks and split the definition of Geeks class into two different files named Geeks1.cs, and Geeks2.cs as shown below:

In Geeks1.cs, and Geeks2.cs, a partial class is created using the partial keyword and each file contains different functionality of Geeks class as shown below.
Разделяемые классы и методы в 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 .