Когда целесообразно использовать частичные классы C #? - PullRequest
471 голосов
/ 30 августа 2010

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

Ответы [ 22 ]

387 голосов
/ 30 августа 2010

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

Лучший способ взглянуть на это - увидеть, как дизайнеры функционировали до частичных классов.Дизайнер WinForms выплевывал весь код внутри региона с жестко сформулированными комментариями о том, как не изменять код.Пришлось вставить всевозможные эвристики, чтобы найти сгенерированный код для последующей обработки.Теперь он может просто открыть файл designer.cs и иметь высокую степень уверенности, что он содержит только код, относящийся к конструктору.

237 голосов
/ 30 августа 2010

Другое использование заключается в разделении реализации различных интерфейсов, например:

partial class MyClass : IF1, IF2, IF3
{
    // main implementation of MyClass
}


partial class MyClass
{
    // implementation of IF1
}

partial class MyClass
{
    // implementation of IF2
}
150 голосов
/ 30 августа 2010

Помимо других ответов ...

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

Это очень помогает, потому что может помочь сделать код намного более читабельным, фактически не влияя на поведение при выполнении. Это также может помочь определить, когда ответственность легко реорганизовать или тесно связана с другими аспектами.

Однако - чтобы было ясно - это все еще плохой код, в конце разработки вы все еще хотите одну ответственность за класс ( НЕ за частичный класс). Это просто трамплин :))

76 голосов
/ 27 мая 2014
  1. Несколько разработчиков Использование частичных классов Несколько разработчиков могут работать в одном классе без труда.
  2. Генератор кода Частичные классы в основном используются генератором кода для хранения разные проблемы отдельно
  3. Частичные методы Используя частичные классы, вы также можете определить частичные методы, где разработчик может просто определить метод, а другой разработчик может реализовать его.
  4. Только частичное объявление метода Даже код компилируется только с объявлением метода и при реализации метода нет, компилятор может безопасно удалить этот кусок код и ошибка времени компиляции не возникнет.

    Для проверки пункта 4. Просто создайте проект winform и добавьте эту строку после конструктора Form1 и попробуйте скомпилировать код

    partial void Ontest(string s);
    

Вот некоторые моменты, которые следует учитывать при реализации частичных классов: -

  1. Использовать частичное ключевое слово в каждой части частичного класса.
  2. Имя каждой части частичного класса должно быть одинаковым, но имя исходного файла для каждой части частичного класса может отличаться.
  3. Все части частичного класса должны находиться в одном пространстве имен.
  4. Каждая часть частичного класса должна находиться в той же сборке или DLL, другими словами, вы не можете создать частичный класс в исходных файлах из другого проекта библиотеки классов.
  5. Каждая часть частичного класса должна иметь одинаковую доступность. (то есть: частный, публичный или защищенный)
  6. Если вы наследуете класс или интерфейс в частичном классе, то он наследуется всеми частями этого частичного класса.
  7. Если часть части класса запечатана, тогда весь класс будет запечатан.
  8. Если часть частичного класса является абстрактной, тогда весь класс будет считаться абстрактным классом.
55 голосов
/ 30 августа 2010

Одним из важных применений является отделение сгенерированного кода от рукописного кода, принадлежащего одному и тому же классу.

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

То же самое относится и к коду WinForms.Весь сгенерированный дизайнером код помещается в один файл, который вы обычно не трогаете.Ваш рукописный код помещается в другой файл.Таким образом, когда вы что-то меняете в Designer, ваши изменения не срываются.

19 голосов
/ 13 сентября 2013

Это правда, что Partial Class используется при автоматической генерации кода, одним из способов может быть поддержка большого файла класса, который может иметь тысячи строк кода.Вы никогда не знаете, что ваш класс может закончиться 10 тысячами строк, и вы не хотите создавать новый класс с другим именем.

public partial class Product
{
    // 50 business logic embedded in methods and properties..
}

public partial class Product
{
    // another 50 business logic embedded in methods and properties..
}
//finally compile with product.class file.

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

Product1.cs

public partial class Product
{
    //you are writing the business logic for fast moving product
}

Product2.cs

public partial class Product
{
    // Another developer writing some business logic...
}

Надеюсь, это имеет смысл!

12 голосов
/ 30 августа 2010

Сохраняйте все как можно более чистыми при работе с огромными классами или при работе в команде, вы можете редактировать без переопределения (или всегда вносить изменения)

11 голосов
/ 30 августа 2010

Основное использование для частичных классов - сгенерированный код.Если вы посмотрите на сеть WPF (Windows Presentation Foundation), вы определите свой пользовательский интерфейс с помощью разметки (XML).Эта разметка компилируется в частичные классы.Вы вводите код частичными собственными классами.

11 голосов
/ 20 июня 2014

Частичные классы охватывают несколько файлов.

How can you use the partial modifier on a C# class declaration?

С частичным вы можете физически разделить класс на несколько файлов.

Эточасто выполняется генераторами кода.

Пример

С обычными классами C # нельзя объявить класс в двух отдельных файлах в одном проекте.

Но с частичным модификатором вы можете.

Это полезно, если один файл обычно редактируется, а другой генерируется машиной или редко редактируется.

An Example will clear your concept.

class Program
{
    static void Main()
    {
    A.A1();
    A.A2();
    }
}

//Contents of file A1.cs: C#

using System;

partial class A
{
    public static void A1()
    {
    Console.WriteLine("A1");
    }
}

//Contents of file A2.cs: C#

using System;

partial class A
{
    public static void A2()
    {
    Console.WriteLine("A2");
    }
}

Output

A1
A2

Требуется частичноездесь.

If you remove the partial modifier, you will get an error containing this text: [The namespace '<global namespace>' already contains a definition for 'A'].

Подсказка: Чтобы исправить это, вы можете использовать частичное ключевое слово или изменить одно из имен классов.

How does the C# compiler deal with partial classes?

Если вы разберете вышеуказанную программу, вы увидите, что файлы A1.cs и A2.cs удалены.

Вы обнаружите, что класс Aприсутствует.

Дизассемблер IL Итак: класс A будет содержать методы A1 и A2 в одном кодовом блоке.Два класса были объединены в один.

Скомпилированный результат A1.cs и A2.cs: C #

internal class A
{
    // Methods
    public static void A1()
    {
    Console.WriteLine("A1");
    }

    public static void A2()
    {
    Console.WriteLine("A2");
    }
}

Сводка

Частичные классы могут упростить определенные ситуации программирования на C #.

Они часто используются в Visual Studio при создании программ Windows Forms / WPF.

Машинный код C # является отдельным.

Или Вы можете найти полное описание здесь .

8 голосов
/ 30 августа 2010

Если у вас достаточно большой класс, который не поддается эффективному рефакторингу, разделение его на несколько файлов помогает упорядочить вещи.

Например, если у вас есть база данных для сайта, содержащего дискуссионный форум и систему продуктов, и вы не хотите создавать два разных класса провайдеров (НЕ то же самое, что прокси-класс, просто для ясности) , вы можете создать один частичный класс в разных файлах, как

MyProvider.cs - основная логика

MyProvider.Forum.cs - методы, относящиеся конкретно к форуму

MyProvider.Product.cs - методы для продуктов

Это просто еще один способ держать вещи в порядке.

Кроме того, как уже говорили другие, это единственный способ добавить методы в сгенерированный класс, не рискуя уничтожить ваши добавления при следующей регенерации класса. Это очень удобно для кода, сгенерированного шаблоном (T4), ORM и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...