Разделяемые классы и методы в C# (ключевое слово partial)

В 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(); 
        }
    }
}

В консоли будет следующим вывод:

Вызываем метод MethodA
Вызываем метод MethodB

В каких случаях может потребоваться разделяемый класс

Microsoft выделяет следующие три варианта, когда может потребоваться использование разделяемых классов:

  1. При работе над большими проектами.  Распределение класса между различными файлами позволяет нескольким программистам работать с ним одновременно.
  2. При работе с использованием автоматически создаваемого источника код можно добавлять в класс без повторного создания файла источника. Например, в Visual Studio этот подход используется при создании форм Windows Forms.
  3. При использовании генераторов источников для создания дополнительных функциональных возможностей в классе.

При этом следует отметить несколько моментов, связанных с использованием распределенных классов в C#:

  1. все части разделяемого класса должны использовать ключевое слово partial.
  2. для формирования окончательного типа все части класса должны быть доступны во время компиляции.
  3. все части должны иметь одинаковые модификаторы доступа, например public, private и т. д.
  4. если какая-либо из частей объявлена абстрактной (abstract), то весь тип будет считаться абстрактным.
  5. если какая-либо из частей объявлена запечатанной (sealed), то весь тип будет считаться запечатанным.
  6. если какая-либо из частей объявляет базовый тип, то весь тип будет наследовать данный класс.

Разделяемые методы

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

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии