Содержание
В 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#. Разделяемые классы и методы могут содержаться в нескольких файлах и при компиляции собираться воедино.
