Содержание
В C# может использоваться такая возможность как разделяемые классы и методы. Суть разделяемого класса (или, как его ещё называют, частичного класса) состоит в том, что несколько частей одного и того же класса могут располагаться в разных файлах, но при компиляции все эти части будут собраны воедино. Рассмотрим основные моменты, связанные с использованием разделяемых классов и методов в C#.
Разделяемые классы
Для определения разделяемого класса используется ключевое слово partial
, которое должно находиться непосредственно перед словом class
. Например, создадим новое консольное приложение и добавим в него два файла со следующим содержимым:
Файл PartialClass_part1.cs:
using System; namespace PartialClasses { public partial class PartialClass { public void MethodA() { Console.WriteLine("Вызываем метод MethodA"); } } }
Файл PartialClass_part2.cs:
using System; namespace PartialClasses { public partial class PartialClass { public void MethodB() { Console.WriteLine("Вызываем метод MethodB"); } } }
В Visual Studio структура проекта будет выглядеть следующим образом:
Таким образом, мы объявили разделяемый класс с двумя методами. Теперь мы можем использовать этот класс, например, в методе Main
следующим образом:
namespace PartialClasses { internal class Program { static void Main(string[] args) { PartialClass partialClass = new PartialClass(); partialClass.MethodA(); partialClass.MethodB(); } } }
В консоли будет следующим вывод:
Вызываем метод MethodB
В каких случаях может потребоваться разделяемый класс
Microsoft выделяет следующие три варианта, когда может потребоваться использование разделяемых классов:
- При работе над большими проектами. Распределение класса между различными файлами позволяет нескольким программистам работать с ним одновременно.
- При работе с использованием автоматически создаваемого источника код можно добавлять в класс без повторного создания файла источника. Например, в Visual Studio этот подход используется при создании форм Windows Forms.
- При использовании генераторов источников для создания дополнительных функциональных возможностей в классе.
При этом следует отметить несколько моментов, связанных с использованием распределенных классов в C#:
- все части разделяемого класса должны использовать ключевое слово
partial
. - для формирования окончательного типа все части класса должны быть доступны во время компиляции.
- все части должны иметь одинаковые модификаторы доступа, например
public
,private
и т. д. - если какая-либо из частей объявлена абстрактной (
abstract
), то весь тип будет считаться абстрактным. - если какая-либо из частей объявлена запечатанной (
sealed
), то весь тип будет считаться запечатанным. - если какая-либо из частей объявляет базовый тип, то весь тип будет наследовать данный класс.
Разделяемые методы
Суть разделяемого метода практически аналогична — в одной части разделяемого класса мы объявляем сигнатуру метода, а в другой части разделяемого класса — тело. Как и в случае с разделяемым классом, разделяемый метод должен начинаться с ключевого слова patrial
. Например, создадим в нашем разделяемом классе разделяемый метод:
Файл PartialClass_part1.cs:
using System; namespace PartialClasses { public partial class PartialClass { public partial void PatrialMethod(); //объявляем разделяемый метод public void MethodA() { Console.WriteLine("Вызываем метод MethodA"); } } }
Файл PartialClass_part2.cs:
using System; namespace PartialClasses { public partial class PartialClass { public partial void PatrialMethod() { Console.WriteLine("Вызов разделяемого метода"); } public void MethodB() { Console.WriteLine("Вызываем метод MethodB"); } } }
Теперь мы можем вызвать разделяемый метод в нашей программе:
using System; namespace PartialClasses { internal class Program { static void Main(string[] args) { PartialClass partialClass = new PartialClass(); partialClass.MethodA(); partialClass.MethodB(); partialClass.PatrialMethod();//вызов разделяемого метода } } }
Разделяемый метод в C# может не содержать реализации (тело метода). В этом случае метод и все вызовы метода удаляются во время компиляции. При этом, стоит отметить, что отсутствие реализации допускается только для следующих разделяемых методов:
- у него нет модификаторов доступа (включая
private
по умолчанию). - он возвращает значение
void
. - у него нет параметров
out
. - у него нет ни одного из следующих модификаторов:
virtual
,override
,sealed
,new
илиextern
.
Итого
Сегодня мы в общих чертах изучили, что из себя представляют разделяемые (частичные) классы и методы в C#. Разделяемые классы и методы могут содержаться в нескольких файлах и при компиляции собираться воедино.