Полное руководство по языку программирования С# 14 и платформе .NET 10 / Дополнительные возможности ООП в C#

C# и .NET | Частичные классы, методы и свойства

Начальный ⏱ 5 мин чтения 👁 2 🕓 обновлено 11.08.2026

Частичные классы

Классы могут быть частичными. То есть мы можем иметь несколько файлов с определением одного и того же класса, и при компиляции все эти определения будут скомпилированы в одно.

Например, определим в проекте два файла с кодом. Не столь важно как эти файлы будут называться, например, "PersonMove.cs" и "PersonEat.cs". Например, в PersonMove.cs определим следующий класс:


public partial class Person
{
	public void Move() => Console.WriteLine("Человек идет");
}

А в другом файле - в PersonEat.cs определим следующий класс:


public partial class Person
{
	public void Eat() => Console.WriteLine("Человек ест");
}

Таким образом, два файла в проекте содержит определение одного и того же класса Person, которые содержат два разных метода. И оба определенных здесь класса являются частичными. Для этого они определяются с ключевым словом partial.

Затем мы можем использовать все методы класса Person:


var tom = new Person();
tom.Move();
tom.Eat();

Консольный вывод:


Человек идет
Человек ест

Таким образом, несколько определений частичного класса объединяются в одно. Стоит отметить, что частичные классы необязательно надо размещать в разных файлах. Они могут помещаться и в один и тот же файл и даже быть размещены рядом:


var tom = new Person();
tom.Move();
tom.Eat();
// Console.WriteLine(tom.Name);

public partial class Person
{
	public void Eat() => Console.WriteLine("Человек ест");
}
public partial class Person
{
	public void Move() => Console.WriteLine("Человек идет");
}

Тем не менее смысл частичных классов состоит в том, что определяя одну версию частичного класса, мы можем не знать, что будет делать другая версия частичного класса. Нередко частичные классы применяются при автогенерации кода, например, по определению пользовательского интерфейса, когда программист пишет основную логику взаимодействия программы с пользователем, а компилятор создает другой частичный класс с логикой отрисовки и позиционирования элементов управления в приложении.

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

Частичные классы могут содержать частичные методы (partial methods). Такие методы также опреляются с ключевым словом partial. Причем определение частичного метода без тела метода находится в одном частичном классе, а реализация этого же метода - в другом частичном классе. Концепция частичных методов в некотором роде похожа на разделение функций на прототипы и реализации в таких языках как C и C++.

Например, пусть у нас будет следующий класс Person:


// объявление частичного класса
public partial class Person
{
	public partial void Say(string message);  // объявление частичного метода
}

Частичный метод Say не имеет тела и представляет лишь объявление. То есть компилятор, встретив подобный метод, будет знать, что метод принимает строку и ничего не возвращает. Причем на момент определения этого класса неизвестно, что представляет собой этот метод, какие действия он будет выполнять. Тем не менее мы знаем список его параметров и можем вызвать его в программе.

Также определим второй класс Person:


// реализация частичного класса
public partial class Person
{
    // реализация частичного метода
	public partial void Say(string message)
    {
        Console.WriteLine(message);
    }
}

Здесь уже определена реализация метода Say(). И когда мы будем вызывать метод Say, будет выполняться эта реализация.

Стоит отметить, что по умолчанию к частичным методам применяется ряд ограничений:

  • Они не могут иметь модификаторы доступа

  • Они имеют тип void

  • Они не могут иметь out-параметры

  • Они не могут иметь модификаторы virtual, override, sealed, new или extern

Если же они не соответствуют какому-то из этих ограничений, то для них должна быть предоставлена реализация. Как, например, в предыдущем примере частичные методы применяют модификатор public, поэтому предоставляется реализация.

Частичные свойства и индексаторы

Язык C# уже давно позволял определять частичные методы (partial methods). Начиная с версии C# 13 также можно определять частичные свойства и индексаторы. То есть мы можем разделить определение свойства/индексатора на объявление и реализацию и разместить их в разных файлах. При этом сигнатуры объявления и реализации должны совпадать. Единственное ограничение - нельзя определять частичные автосвойства. Если свойство, объявленное со словом partial, не имеет реализации, то оно рассматривается как объявление свойства.

Пример частичного свойства:


var tom = new Person("Tom");

Console.WriteLine(tom.Name);

// объявление класса
partial class Person{
    public partial string Name { get; set; }  // объявление частичного свойства
}

// реализация класса
partial class Person{
    private string name; // поле для хранения значения свойства

    public Person(string name) => this.name = name;

    public partial string Name    // реализация частичного свойства
    {
        get => name;
        set => name = value;
    }
}

Здесь определен частичный класс Person. Причем сначала идет только объявление класса Person:


partial class Person{
    public partial string Name { get; set; }  // объявление частичного свойства
}

В этом объявлении таже только объявление частичного свойства - Name. И хотя это объявление похоже на автоматическое свойство, это не автосвойство, а именно объявление свойства, так как к нему применяется модификатор partial

Далее идет собственно реализация класса и в том числе реализация свойства:


partial class Person{
    private string name; // поле для хранения значения свойства

    public Person(string name) => this.name = name;

    public partial string Name    // реализация частичного свойства
    {
        get => name;
        set => name = value;
    }
}

Хотя в данном случае для простоты объявление и реализация класса размещены рядом друг с другом, в реальности их можно разместить в разных файлах.

Пример с частичными индексаторами:


var buffer = new Buffer();

// некоторые действия с индексатором
for(var i=0; i < Buffer.COUNT; ++i){
    buffer[i] = i * i;
}

for(var i=0; i < Buffer.COUNT; ++i){
    Console.WriteLine(buffer[i]);
}
// объявление класса
partial class Buffer{
    public partial int this[int index]  { get; set; }  // объявление свойства-индексатора
}

// реализация класса
partial class Buffer{
    public const int COUNT = 6;
    private int[] data = new int[COUNT];
    public partial int this[int index]    // реализация свойства-индексатора
    {
        get => data[index];
        set => data[index] = value;
    }
}

В данном случае частичный индексатор определен в частичном классе Buffer. Фактически индексатор является надстройкой над массивом data.

Проверь себя

📋 Тест по теме «C# и .NET | Частичные классы, методы и свойства» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

public _____ class Person
{
	public void Move() => Console.WriteLine("Человек идет");
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

public partial class _____
{
	public void Eat() => Console.WriteLine("Человек ест");
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

var tom = new _____();
tom.Move();
tom.Eat();
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

var tom = new Person();
tom._____();
tom.Eat();
// Console.WriteLine(tom.Name);

public partial class Person
{
	public void Eat() => Console.WriteLine("Человек ест");
}
public partial class Person
{
	public void Move() => Console.WriteLine("Человек идет");
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

public _____ class Person
{
	public void _____() => Console.WriteLine("Человек идет");
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

public _____ class Person
{
	public void _____() => Console.WriteLine("Человек ест");
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

public partial class Person
}
	public void Move() => Console.WriteLine("Человек идет");
{
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «C# и .NET | Частичные классы, методы и свойства»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «C# и .NET | Частичные классы, методы и свойства», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

public partial class Person
{
	public void Move() => Console.WriteLine("Человек идет");
}
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «C# и .NET | Частичные классы, методы и свойства»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

public partial class Person
{
	public void Eat() => Console.WriteLine("Человек ест");
}
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «C# и .NET | Частичные классы, методы и свойства»
+50 XP

Соберите небольшую программу, которая последовательно демонстрирует ключевые идеи урока. Программа должна быть рабочей и содержать минимум два самостоятельно написанных фрагмента, а не просто копию примера из урока.

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «C# и .NET | Частичные классы, методы и свойства»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «C# и .NET | Частичные классы, методы и свойства». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.