Частичные классы в С#

Хорошо ли используются частичные классы вне сценариев сценариев, созданных с помощью webforms/winforms? Или эта функция в основном поддерживает это?

Ответ 1

Отчасти для поддержки сценариев (WebForms, WinForms, LINQ-to-SQL и т.д.) смешение сгенерированного кода с кодом программиста.

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

Ответ 2

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

Возьмите WinForms или Typed-DataSets, например (или любой дизайнер, если на то пошло). Каждый раз, когда вы вносите изменения в конструктор, он сериализует соответствующий код в файл. Скажем, вам нужно предоставить несколько дополнительных методов, о которых генератор ничего не знает. Если вы добавили его в сгенерированный файл, ваши изменения будут потеряны при следующем его создании.

В проекте, над которым я сейчас работаю, используется генерация кода для всех DAL, BLL и бизнес-объектов. Однако генератор получает только 75% информации. Остальная часть должна быть ручной кодировкой (например, пользовательская бизнес-логика). Я могу предположить, что каждый класс BLL имеет метод SelectAll, поэтому его легко сгенерировать. Однако у моего клиента BLL также должен быть метод SelectAllByLocation. Я не могу поместить это в свой генератор, потому что он не является общим для всех классов BLL. Поэтому я генерирую все мои классы как частичные классы, а затем в отдельном файле я определяю свои собственные методы. Теперь по дороге, когда моя структура меняется, или мне нужно восстановить мой BLL по какой-то причине, мой пользовательский код не будет уничтожен.

Ответ 3

Я использую частичные классы как средство разделения различных подэлементов пользовательских элементов управления, которые я пишу. Кроме того, при использовании с программным обеспечением создания сущности он позволяет таким продуктам, как LLBLGen, создавать сгенерированные версии классов, а также настраиваемую пользовательскую отредактированную версию, которая не будет заменена, если объекты должны быть восстановлены.

Ответ 4

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

Мы также использовали их для группировки переопределений запаса или сокрытия набора свойств. Такие вещи. Это удобный способ смешивания в изменении запаса (просто скопируйте файл и измените имя частичного класса на целевой класс), если целевой класс тоже делается частичным).

Ответ 5

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

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

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

// Main Part
public partial class Class1
{
    private partial void LogSomethingDebugOnly();

    public void SomeMethod()
    {
        LogSomethingDebugOnly();
        // do the real work
    }
}

// Debug Part - probably in a different file
public partial class Class1
{

    #if DEBUG

    private partial void LogSomethingDebugOnly()
    {
        // Do the logging or diagnostic work
    }

    #endif
}

Ответ 6

LINQ to SQL хорошо использует частичные классы для расширения кода, созданного разработчиком. Я думаю, вы, как правило, обнаружите, что этот шаблон частичных классов используется созданным конструктором кодом.

Ответ 7

Я считаю частичные классы чрезвычайно полезными. Обычно они используются для расширения автогенерируемых классов. Я использовал их в одном проекте с тяжелыми модульными тестами. У моих классов UT были сложные зависимости, и было не очень удобно разделять код на несколько классов. Конечно, лучше использовать наследование\состав, но в некоторых случаях частичные классы могут быть полезными для ралли.

Ответ 8

Как упоминалось ранее, я тоже думаю, что это запах кода.

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

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

Ответ 9

может быть, слишком поздно, но, пожалуйста, позвольте мне добавить мои 2 цента тоже:

*. При работе над большими проектами распространение класса по отдельным файлам позволяет одновременно работать с несколькими программистами.

*. Вы можете легко написать свой код (для расширенной функциональности) для генерируемого класса VS.NET. Это позволит вам написать код вашей собственной потребности, не вникая в сгенерированный системой код

Ответ 10

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

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

Ответ 11

В UserControls, которые относительно сложны, я помещаю материал обработки событий в один файл, а также картину и свойства в другой файл. Частичные классы отлично подходят для этого. Обычно эти части класса относительно независимы, и приятно иметь возможность редактировать изображения и обработку событий бок о бок.

Ответ 12

Я работал над проектом пару лет назад, когда у нас был типизированный класс DataSet, в котором было тонны кода: методы в DataTables, методы в TableAdapters, объявления экземпляров TableAdapter, которые вы называете. Это была огромная центральная точка проекта, в которой каждый должен был часто работать, и было много конфликтов с контролем источника над частичным файлом кода класса.

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

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

Ответ 13

Как правило, я считаю его запахом кода.

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

Или это означает, что theres нет иерархии наследования, где должен быть один.

Для сценариев генерации кода это хорошо, но я думаю, что генерация кода - еще один запах кода.

Ответ 14

Я опаздываю в игре... но только мои 2 цента...

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

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

Ответ 15

Исправление, как отметил Мэтт, обе части частичной необходимости должны находиться в одной и той же сборке. мой плохой.

Ответ 16

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

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

Ответ 17

Я просто нашел использование для частичных классов. У меня есть класс [DataContract], который я использую для передачи данных клиенту. Я хотел, чтобы клиент мог отображать класс определенным образом (текстовый вывод). поэтому я создал частичный класс и переопределил метод ToString.

Ответ 18

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

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

Ответ 19

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

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

Ответ 20

EDIT: DSL Tools для Visual Studio использует частичные классы.

Таким образом, это функция, используемая многими автоматическими генерируемыми кодами. Вместо использования #region автоматически сгенерированный код переходит в один файл, а код пользователя (также называемый пользовательским кодом) переходит в другой и даже в разные каталоги, так что разработчик не путается с таким количеством бессмысленных файлов.

Хорошо иметь этот выбор, который вы можете комбинировать, но не принудительно использовать - с наследованием

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