Что такое partial class в C#?

Ответ

Partial class (частичный класс) в C# — это возможность разделить определение одного класса, структуры, интерфейса или метода на несколько исходных файлов. Это особенно полезно при работе с автоматически генерируемым кодом, чтобы отделить пользовательские изменения от машинного кода.

Ключевые правила:

  • Все части должны использовать модификатор partial.
  • Все части должны находиться в одном пространстве имен (namespace) и одной сборке (assembly).
  • Во время компиляции все части объединяются в один тип.

Пример разделения класса:

// File1.cs - Автоматически генерируемый код (например, дизайнером формы)
public partial class UserForm
{
    private void InitializeComponent()
    {
        // Автоматически созданная разметка
    }
}

// File2.cs - Ручные правки разработчика
public partial class UserForm
{
    public UserForm()
    {
        InitializeComponent();
        this.Load += OnFormLoaded;
    }

    private void OnFormLoaded(object sender, EventArgs e)
    {
        // Пользовательская логика загрузки
    }
}

Основные сценарии использования:

  1. Разделение сгенерированного и ручного кода (WinForms, WPF, Entity Framework, веб-сервисы).
  2. Организация больших классов — логически группировать методы по файлам (например, CustomerRepository.Queries.cs, CustomerRepository.Commands.cs).
  3. Параллельная работа — несколько разработчиков могут работать над разными частями одного класса, минимизируя конфликты слияния в системе контроля версий.

Ответ 18+ 🔞

Смотри, вот тебе про partial классы в C# — штука, которая реально выручает, когда голова уже болит от бардака в коде.

Представь, что ты делаешь форму в WinForms. Там же дизайнер эту хуйню генерирует — кучу кода с контролами, их расположением и прочей ерундой. И если ты туда, в этот сгенерированный файл, начнёшь свою логику пихать, то потом, когда дизайнер обновится, он всё твоё творчество нахуй сотрёт, как будто его и не было. Вот тут-то partial класс и спасает, как божий подарок.

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

Главные правила, чтобы не обосраться:

  1. Ко всем кускам одного класса в каждом файле надо прилепить слово partial. Без этого — пиздец, не скомпилируется.
  2. Все эти файлы должны быть в одной сборке и одном неймспейсе. Нельзя одну часть в MyApp.Data запихнуть, а другую в MyApp.View — нихуя не выйдет.
  3. Модификаторы доступа (типа public, internal) должны совпадать. Не получится одну часть сделать public, а другую private.

Вот живой пример, как это выглядит:

Файл Form1.Designer.cs — тут код, который Visual Studio сам генерирует. Трогать его страшно, он священный.

namespace MyApp
{
    public partial class Form1
    {
        // Вся эта хуйня создана автоматически
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.TextBox textBox1;

        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            // ... куча настроек контролов
        }
    }
}

А теперь файл Form1.cs — это уже твоя вотчина, тут можно творить что угодно, не боясь, что дизайнер всё похерит.

namespace MyApp
{
    public partial class Form1
    {
        public Form1()
        {
            // Вызов метода из сгенерированного файла
            InitializeComponent();
            // А тут уже твоя логика, которую не съедят
            button1.Click += Button1_Click;
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "Ну нахуй, я же нажал!";
        }
    }
}

Видишь? Один класс Form1, но разбит на два файла. Автоматическое — отдельно, ручное — отдельно. Красота, а не жизнь.

Где ещё это впадлу полезно?

  1. Организация монструозных классов. Допустим, у тебя репозиторий на 3000 строк. Можно не держать всё в одном файле, а раскидать по смыслу: UserRepository.Queries.cs, UserRepository.Commands.cs, UserRepository.Validation.cs. В каждом файле — partial class UserRepository. Гораздо проще ориентироваться, ебать колотить.
  2. Работа в команде. Если вас десять мудаков пилят одну жирную сущность, можно минимизировать конфликты в гите. Каждый работает в своём паршиал-файле, и не приходится постоянно мержить одну и ту же помойку Customer.cs.

Короче, partial классы — это не какая-то магия, а просто удобный инструмент, чтобы не устраивать в коде срач. Используй на здоровье, когда нужно разделить машинное и человеческое, или когда один класс распух как свинья перед забоем.