Частичные классы и методы

В этой статье я собираюсь объяснить, что такое частичные классы и частичные методы, и как их реализовать на C #.

В C # идентификатор, используемый для идентификации класса, должен быть уникальным; однако при работе над крупномасштабными проектами может потребоваться, чтобы несколько разработчиков работали над одним и тем же классом или методами одновременно. По этой причине Microsoft представила частичное ключевое слово и добавила эту новую функцию в C # 2.0.

Ключевое слово partial позволяет разделить определение класса на разные части в одном пространстве имен, которые будут объединены при компиляции приложения.

Чтобы использовать эту функцию, каждая часть должна:

  • Используйте ключевое слово частичное.
  • Будьте доступны во время компиляции.
  • Иметь одинаковый модификатор доступа (открытый, закрытый, защищенный и внутренний).
  • Находиться в том же пространстве имен, что и другие части.

Также важно отметить, что:

  • Если хотя бы одна часть объявлена ​​абстрактной, то весь тип считается абстрактным.
  • Если хотя бы одна часть объявлена ​​запечатанной, то весь тип считается запломбированным.
  • Если хотя бы одна часть объявляет базовый тип, то весь тип наследует этот класс (даже части, в которых не указан базовый класс, по-прежнему наследуют базовый тип).
  • Любые члены класса, структуры или интерфейса, объявленные в одной части, доступны всем остальным частям.

Например, если мы рассмотрим следующие части:

PartialClassFirstFile.cs

partial class Earth : Planet, IRotate
{
    public void CalcolateMass() { … }
}

PartialClassSecondFile.cs

partial class Earth : IRevolve
{
    public void CalcolateSpeed() { … }
}

После завершения компиляции эквивалентный класс:

class Earth : Planet, IRotate, IRevolve
{
    public void CalcolateMass() { … }
    public void CalcolateSpeed() { … }
}

Ключевое слово partial также можно применять к методам. Его поведение очень похоже на поведение классов, фактически, класс может содержать сигнатуру метода, а другая часть может предоставлять его реализацию. Обе части будут объединены во время компиляции.

Если реализация не предоставлена, компилятор оптимизирует код, удалив и метод, и все вызовы во время компиляции.

Важно упомянуть этот частичный метод:

  • должен возвращать void.
  • могут иметь параметры in или ref, но не out (должны быть назначены параметры out, а поскольку частичный метод может быть не реализовано, использование таких параметров не допускается).
  • являются неявно частными (следовательно, не могут быть виртуальными).
  • могут иметь статические и небезопасные модификаторы.
  • могут быть дженериками.

В следующем примере мы добавим немного больше кода к предыдущему коду.

PartialClassFirstFile.cs

partial class Earth : Planet, IRotate
{
    public void CalcolateMass() { … }
    public partial void CalcolateVolume() { }
    public partial void CalcolateForce() { }
}

PartialClassSecondFile.cs

partial class Earth : IRevolve
{
    public void CalcolateSpeed() { … }
    public partial void CalcolateVolume() { … }
}

В этом случае класс Earth, реализованный в файле PartialClassFisrtFile.cs, объявляет только сигнатуру метода как CalcolateVolume, так и CalcolateForce. Хотя метод CalcolateVolume реализован в относительном классе в файле PartialClassSecondFile.cs, другой метод - нет, что означает, что после завершения компиляции метод CalcolateForce будет удален, а последний класс будет :

class Earth : Planet, IRotate, IRevolve 
{
    public void CalcolateMass() { … }
    public void CalcolateVolume() { … }
    public void CalcolateSpeed() { … }
}