Partial class c что это
Классы могут быть частичными. То есть мы можем иметь несколько файлов с определением одного и того же класса, и при компиляции все эти определения будут скомпилированы в одно.
Например, определим в проекте два файла с кодом. Не столь важно как эти файлы будут называться. Например, PersonBase.cs и PersonAdditional.cs. В одном из этих файлов (без разницы в каком именно) определим следующий класс:
public partial class Person < public void Move() < Console.WriteLine("I am moving"); >>
А в другом файле определим следующий класс:
public partial class Person < public void Eat() < Console.WriteLine("I am eating"); >>
Таким образом, два файла в проекте содержит определение одного и того же класса Person, которые содержат два разных метода. И оба определенных здесь класса являются частичными. Для этого они определяются с ключевым словом partial .

Затем мы можем использовать все методы класса Person:
class Program < static void Main(string[] args) < Person tom = new Person(); tom.Move(); tom.Eat(); Console.ReadKey(); >>
Частичные методы
Частичные классы могут содержать частичные методы. Такие методы также опреляются с ключевым словом partial . Причем определение частичного метода без тела метода находится в одном частичном классе, а реализация этого же метода — в другом частичном классе.
Например, изменим выше определенные классы Person. Первый класс:
public partial class Person < partial void Read(); public void DoSomething() < Read(); >>
public partial class Person < partial void Read() < Console.WriteLine("I am reading a book"); >>
В первом классе определен метод Read() . Причем на момент определения первого класса неизвестно, что представляет собой этот метод, какие действия он будет выполнять. Тем не менее мы знаем список его параметров и можем вызвать в первом классе.
Второй класс уже непосредственно определяет тело метода Read() .
class Program < static void Main(string[] args) < Person tom = new Person(); tom.DoSomething(); >>
Стоит отметить, что по умолчанию к частичным методам применяется ряд ограничений:
- Они не могут иметь модификаторы доступа
- Они имеют тип void
- Они не могут иметь out-параметры
- Они не могут иметь модификаторы virtual, override, sealed, new или extern
Если же они не соответствуют какому-то из этих ограничений, то для них должна быть предоставлена реализация. Как, например, в следующем примере частичные методы применяют модификатор public :
// первая реализация класса и его методов public partial class Person < public partial void Read(); public void DoSomething() < Read(); >> // вторая реализация класса и его методов public partial class Person < public partial void Read() < Console.WriteLine("I am reading a book"); >>
Разделенные classes в Си Шарп

Класс в объектно-ориентированном программировании – модель, необходимая для создания объектов определенного типа. Она будет описывать структуру соответствующих компонентов программного кода (набор полей и их первоначальное состояние), а также формировать алгоритмы (методы и функции) для работы с ними. Классы необходимы для введения абстрактных типов данных в программный код. Они определяют не только интерфейс, но и реализацию для всех своих экземпляров.
В C# имеются разделенные классы. О них и пойдет речь ниже. Предстоит тщательно изучить соответствующие классы и методы, а также рассмотреть несколько наглядных примеров. Эта информация поможет не только новичкам, но и опытным разработчикам.
Разделяемые классы – это…
В C# можно провести разделение класса между несколькими исходными файлами. Каждый документ с исходным кодом будет содержать часть (part) определения class. Во время компиляции все его составляющие будут объединяться.
The partial class C# помогает работать над одним классом сразу нескольким людям. Это особо актуально, когда речь идет о крупном проекте и большом количестве разработчиков.
Чтобы воспользоваться соответствующим компонентом нужно использовать ключевое слово partial. Оно поможет разделить определение class.
Особенности
The partial – слово, которое указывает на то, что иные части class могут быть объявлены в имеющемся пространстве имен. Если нужно создать the partial class, недостаточно использовать соответствующий ключ. Дополнительно придется запомнить следующие особенности:
- Если хотя бы в одной части установлено объявление abstract, то и финальный тип окажется in the same. То же самое касается sealed.
- Если в части рассматриваемого элемента объявлен базовые класс, финальный тип унаследует его.
- Любой член, объявленный в the partial class, доступен остальным его parts.
- Все части the partial должны быть включены в одно и то же пространство имен.
Модификатор the partial недоступен при объявлении делегатов, а также возможных перечислений. У всех переменных в них должны быть одинаковые модификаторы доступа.
Разделяемые методы
You can use in the partial classes the partial методы. Одна из частей имеющегося класса включает в себя сигнатуру метода. Остальная – может быть включает в ней же или в другой. Если реализация не предоставлена, метод и все его вызовы удаляются при компиляции.
Здесь рекомендуется запомнить следующее:
- для задания all the partial methods используется ключевое слово «partial»;
- в качестве типа возвращаемого значения устанавливается void;
- у the partial methods неявный тип – private;
- соответствующие методы не могут иметь тип virtual.
Теперь можно рассмотреть несколько наглядных примеров. Они помогут более подробно разобраться в изучаемом направлении. А еще – наглядно продемонстрируют то, как работает a class и a partial methods.
Высота и ширина
Первый пример – это приложение под названием HeightWeightInfo. В качестве результата его работы используется вывод в консоль информации о высоте и ширине. Внутри проекта будет находиться файл File1.cs, который имеет разделенный class Record. В нем определены целочисленные переменные – h и w. Здесь же реализован метод/конструктор Record. Он отвечает за присваивание переменным значений.
File1. cs выглядит так:
namespace HeightWeightInfo < class File1 < >public partial class Record < private int h; private int w; public Record(int h, int w) < this.h = h; this.w = w; >> >
Второй документ будет называться File2.cs. Он включает в себя точно такой же класс Records. Внутри него будет размещаться метод PrintRecord. Он отвечает за вывод в консоль значений переменных h и w:
namespace HeightWeightInfo < class File2 < >public partial class Record < public void PrintRecord() < Console.WriteLine("Высота:"+ h); Console.WriteLine("Ширина:"+ w); >> >
В данном проекте есть еще и метод the main. Он будет иметь следующую форму представления:
namespace HeightWeightInfo < class Program < static void Main(string[] args) < Record myRecord = new Record(10, 15); myRecord.PrintRecord(); Console.ReadLine(); >> >
Здесь можно увидеть объект класса myRecord. В виде его параметров выступят значения h и w, которые будут определяться в File1.cs. Метод PrintRecord будет вызван объектом myRecord. Он объявлен в File2.cs. Ключевое слово keyword позволяет объединить атрибуты the class, объявленного в разных файлах, в единое целое.
The partial в C Sharp может быть полезен в нескольких случаях:
- При формировании проекта, в котором задействовано больше одного разработчика. The partial позволяет работать совместно над одним и тем же классом.
- Когда необходимо дополнить или отредактировать класс без повторного создания исходного файла, который автоматически генерируется IDE.
Также стоит изучить еще один наглядный пример of the C# code, который поможет лучше понять разделенные методы языка.
Пример для методов
В качестве примера можно взять the partial class Car, который объявлен в File1.cs. В нем будет содержаться три метода:
- InitializeCar();
- BuildRim();
- BuildWheels().
Среди них будет объявлен the partial class InitializeCar. В виде программы этот фрагмент выглядит так, как показано ниже.
public partial class Car < partial void InitializeCar(); public void BuildRim() < >public void BuildWheels()
Проект включает в себя документ File2. Он поддерживает BuildEngine и InitializeCar. Реализация метода разделена на 2 части: сначала происходит объявление в файле File1, затем – выполнение в file2.
Как быстро освоить тему
Для более быстрого и качественного изучения C#, его классов и методов, а также иных возможностей, рекомендуется закончить специализированные дистанционные компьютерные курсы. Пример – от OTUS.
На них помогут с нуля освоить любой язык разработки, фреймворк или инновационную IT-профессию. Пользователи получат шанс влиться в информационные технологии в срок от нескольких месяцев до года. Им предлагается широкий выбор специальностей и направлений – разрешено остановиться на одном или нескольких вариантах.
К преимуществам онлайн-курсов относят:
- постоянное кураторство;
- интересные домашние и практические задания;
- помощь в формировании портфолио;
- сжатые сроки обучения и возможность его совмещения с повседневными делами;
- грамотно составленные программы, изложенные понятным языком.
В конце обучения всем ученикам будут выданы электронные сертификаты. С их помощью удастся подтвердить приобретенный спектр навыков и умений документально и полностью официально.
Разделяемые классы и методы (Руководство по программированию в C#)
Можно разделить определение класса, структуры, интерфейса или метода между двумя или более исходными файлами. Каждый исходный файл содержит часть определения класса или метода, а во время компиляции приложения все части объединяются.
Разделяемые классы
Существует несколько ситуаций, когда желательно разделение определения класса.
- При работе над большими проектами распределение класса между различными файлами позволяет нескольким программистам работать с ним одновременно.
- При работе с использованием автоматически создаваемого источника код можно добавлять в класс без повторного создания файла источника. Visual Studio использует этот подход при создании форм Windows Forms, кода оболочки веб-службы и т. д. Можно создать код, который использует эти классы, без необходимости изменения файла, созданного в Visual Studio.
- При использовании генераторов источников для создания дополнительных функциональных возможностей в классе.
Чтобы разделить определение класса, используйте модификатор ключевого слова partial, как показано ниже:
public partial class Employee < public void DoWork() < >> public partial class Employee < public void GoToLunch() < >>
Ключевое слово partial указывает, что другие части класса, структуры или интерфейса могут быть определены в пространстве имен. Все части должны использовать ключевое слово partial . Для формирования окончательного типа все части должны быть доступны во время компиляции. Все части должны иметь одинаковые модификаторы доступа, например public , private и т. д.
Если какая-либо из частей объявлена абстрактной, то весь тип будет считаться абстрактным. Если какая-либо из частей объявлена запечатанной, то весь тип будет считаться запечатанным. Если какая-либо из частей объявляет базовый тип, то весь тип будет наследовать данный класс.
Все части, указывающие базовый класс, должны быть согласованы друг с другом, а части, не использующие базовый класс, все равно наследуют базовый тип. Части могут указывать различные базовые интерфейсы, и окончательный тип будет реализовывать все интерфейсы, перечисленные во всех разделяемых объявлениях. Любые члены класса, структуры или интерфейса, объявленные в разделяемом объявлении, доступны для всех остальных частей. Окончательный тип представляет собой комбинацию всех частей, выполненную во время компиляции.
Модификатор partial недоступен в объявлениях делегатов или перечислений.
В следующем примере показано, что вложенные типы могут быть разделяемыми, даже если тип, в который они вложены, не является разделяемым.
class Container < partial class Nested < void Test() < >> partial class Nested < void Test2() < >> >
Во время компиляции атрибуты определений разделяемого типа объединяются. В качестве примера рассмотрим следующие объявления:
[SerializableAttribute] partial class Moon < >[ObsoleteAttribute] partial class Moon
Они эквивалентны следующим объявлениям:
[SerializableAttribute] [ObsoleteAttribute] class Moon
Следующие элементы объединяются из всех определений разделяемого типа:
- Комментарии XML
- интерфейсы
- атрибуты параметров универсального параметра
- атрибуты классов
- members
В качестве примера рассмотрим следующие объявления:
partial class Earth : Planet, IRotate < >partial class Earth : IRevolve
Они эквивалентны следующим объявлениям:
class Earth : Planet, IRotate, IRevolve
Ограничения
Имеется несколько правил, которые необходимо выполнять при работе с определениями разделяемого класса.
-
Все определения разделяемого типа, являющиеся частями одного типа, должны изменяться с использованием типа partial . Например, следующие объявления класса приведут к появлению ошибки:
public partial class A < >//public class A < >// Error, must also be marked partial
partial class ClassWithNestedClass < partial class NestedClass < >> partial class ClassWithNestedClass < partial class NestedClass < >>
- public
- private
- protected
- internal
- abstract
- sealed
- базовый класс
- модификатор new (вложенные части)
- универсальные ограничения
Дополнительные сведения см. в разделе Ограничения параметров типа.
Примеры
В следующем примере поля и конструктор класса Coords объявлены в одном определении разделяемого класса, а член PrintCoords — в другом определении разделяемого класса.
public partial class Coords < private int x; private int y; public Coords(int x, int y) < this.x = x; this.y = y; >> public partial class Coords < public void PrintCoords() < Console.WriteLine("Coords: ,", x, y); > > class TestCoords < static void Main() < Coords myCoords = new Coords(10, 15); myCoords.PrintCoords(); // Keep the console window open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); >> // Output: Coords: 10,15
В следующем примере показано, что можно также разработать разделяемые структуры и интерфейсы.
partial interface ITest < void Interface_Test(); >partial interface ITest < void Interface_Test2(); >partial struct S1 < void Struct_Test() < >> partial struct S1 < void Struct_Test2() < >>
Разделяемые методы
Разделяемый класс или структура могут содержать разделяемый метод. Одна часть класса содержит сигнатуру метода. В той же или в другой части можно определить реализацию. Если реализация не предоставлена, метод и все вызовы метода удаляются во время компиляции. Реализация может потребоваться в зависимости от сигнатуры метода. Разделяемый метод может не иметь реализацию в следующих случаях.
- У него нет модификаторов доступа (включая private по умолчанию).
- Он возвращает значение void.
- У него нет параметров out.
- У него нет ни одного из следующих модификаторов: virtual, override, sealed, new или extern.
Любой метод, не соответствующий всем этим ограничениям (например, метод public virtual partial void ), должен предоставлять реализацию. Эта реализация может быть предоставлена генератором источника.
Разделяемые методы позволяют разработчику одного элемента класса объявить метод. Разработчик другого элемента класса может определить этот метод. Существует два сценария, в которых выгодно использовать разделяемые методы: шаблоны, создающие стереотипный код и генераторы источника.
- Код шаблона: шаблон резервирует имя и подпись метода, чтобы созданный код мог вызвать метод. Эти методы придерживаются ограничений, которые позволяют разработчику решить, следует ли реализовать этот метод. Если метод не реализован, то компилятор удаляет сигнатуру метода и все вызовы этого метода. Вызовы метода, включая любые результаты, которые могли бы произойти от оценки аргументов в вызовах, не имеют эффекта во время выполнения. Таким образом, любой код в разделяемом классе может свободно использовать разделяемый метод, даже если реализация не предоставлена. Во время компиляции и выполнения программы не возникнут никакие ошибки, если метод будет вызван, но не реализован.
- Генераторы источников: генераторы источников предоставляют реализацию методов. Разработчик может добавить объявление метода (часто с атрибутами, считанными генератором источника). Разработчик может написать код, который вызывает эти методы. Генератор источника выполняется во время компиляции и обеспечивает реализацию. В этом сценарии не соблюдаются ограничения для разделяемых методов, которые не могут реализовываться часто.
// Definition in file1.cs partial void OnNameChanged(); // Implementation in file2.cs partial void OnNameChanged() < // method body >
- Объявления разделяемого метода должны начинаться с контекстного ключевого слова partial.
- Сигнатуры разделяемого метода в обеих частях разделяемого типа должны совпадать.
- Разделяемые методы могут иметь модификаторы static и unsafe.
- Разделяемые методы могут быть универсальными. Ограничения налагаются на ту часть объявления разделяемого метода, где находится определение, и могут дополнительно повторяться в разделе реализации. Имена параметров и типов параметров необязательно должны совпадать в объявлении реализации и в объявлении определения.
- Можно использовать делегат в качестве определенного и реализованного разделяемого метода, но его нельзя использовать в качестве разделяемого метода, который только определен.
Спецификация языка C#
Дополнительные сведения см. в разделе Разделяемые типы в Спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
См. также
- Руководство по программированию на C#
- Классы
- Типы структур
- Интерфейсы
- Разделяемый (тип)
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Разделяемый (частичный) класс
Если вы работали с C#, или, возможно, даже с другим языком программирования, то привыкли к тому, что имя класса должно быть уникальным — т.е. не может быть двух классов с одинаковым именем внутри одного пространства имен. Однако, в какой-то момент, Microsoft решила изменить это, с введением частичных классов.
Когда вы определяете класс с помощью ключевого слова partial, вам или кому-либо другому разрешается ввести функциональные возможности класса с помощью другого класса, который также должен быть объявлен как partial. Это полезно в следующих ситуациях:
- Когда у вас есть очень большой класс — вы можете сохранить его в нескольких файлах, чтобы облегчить работу с различными частями классов. Например, вы можете иметь все свойства в одном файле и все методы в другом файле, имея при этом только один класс.
- При работе с конструктором, как в Visual Studio, например с WinForms, где весь автоматически сгенерированный код конструктора может храниться в одном файле, в то время как код хранится в другом файле.
Позвольте мне проиллюстрировать это примером. В моем проекте у меня обычный Programm.cs, представленный в консольном приложении. Кроме того, я добавил два файла: PartialClass1.cs и PartialClass2.цезий. Вот файлы и их содержимое:
using System;
namespace PartialClasses
public partial class PartialClass
public void HelloWorld()
Console.WriteLine("Hello, world!");
>
>
>
using System;
namespace PartialClasses
public partial class PartialClass
public void HelloUniverse()
Console.WriteLine("Hello, universe!");
>
>
>
Обратите внимание, что оба класса определены с помощью ключевого слова partial и имеют одинаковые имена. Также заметьте, что каждый из них определяет метод — HelloWorld () и HelloUniverse (). в нашей Programm.cs теперь мы можем использовать этот класс, как если бы он был определен только в одном месте, как и любой другой класс:
using System;
namespace PartialClasses
class Program
static void Main(string[] args)
PartialClass pc = new PartialClass();
pc.HelloWorld();
pc.HelloUniverse();
>
>
>
Резюме
С помощью разделяемых классов можно разделить классы на несколько файлов, либо потому, что определение класса очень большое, либо когда инструменты, с которыми вы работаете, приносят пользу, как с конструктором Visual Studio для WinForms.
This article has been fully translated into the following languages:
Is your preferred language not on the list? Click here to help us translate this article into your language!