Когда целесообразно использовать частичные classы C #?

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

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

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

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

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

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

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

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

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

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

    Чтобы проверить точку 4. Просто создайте проект winform и включите эту строку после Form1 Constructor и попытайтесь скомпилировать код

     partial void Ontest(string s); 

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

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

Одно замечательное использование – это разделение сгенерированного кода из рукописного кода, принадлежащего одному classу.

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

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

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

 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. 

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

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... } 

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

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

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

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

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

Это часто делают генераторы кода.

пример

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

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

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

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 '' already contains a definition for 'A'].

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

How does the C# compiler deal with partial classes?

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

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

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

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

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

Резюме

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

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

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

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

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

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

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

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

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

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

Это просто еще один способ сохранить организованность.

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

Другое использование, которое я видел,

Расширение большого абстрактного classа в отношении логики доступа к данным,

У меня есть разные файлы с именами Post.cs, Comment.cs, Pages.cs …

 in Post.cs public partial class XMLDAO :BigAbstractClass { // CRUD methods of post.. } in Comment.cs public partial class XMLDAO :BigAbstractClass { // CRUD methods of comment.. } in Pages.cs public partial class XMLDAO :BigAbstractClass { // CRUD methods of Pages.. } 

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

Вы можете «расширить» classы обслуживания, не перезаписывая их при обновлении служебной ссылки.

В качестве альтернативы пред-компилятору.

Если вы используете директивы предварительного компилятора (а именно #IF DEBUG ), то в итоге вы получите какой-то гнурно выглядящий код, смешанный с вашим фактическим кодом Release.

Вы можете создать отдельный частичный class, чтобы содержать этот код, и либо обернуть весь неполный class в директиве, либо опустить этот код-файл от отправки в компилятор (фактически делая то же самое).

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

  Частичный открытый class zzFileConverterRegistrar
     Регистр событий (главный преобразователь ByVal как zzFileConverter)
     Sub registerAll (ByVal mainConverter as zzFileConverter)
         Регистр RaiseEvent (mainConverter)
     End Sub
 Конечный class 

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

 Частичный открытый class zzFileConverterRegistrar
     Private Sub RegisterGif (ByVal mainConverter as zzFileConverter) Обрабатывает Me.Register
         mainConverter.RegisterConverter («GIF», GifConverter.NewFactory))
     End Sub
 Конечный class

Обратите внимание, что основной class конвертера файлов не «открыт» – он просто предоставляет небольшой class заглушки, к которому могут подключаться модули расширения. Существует небольшой риск конфликтов имен, но если подпрограмма «register» каждого модуля надстройки называется в соответствии с типом файла, с которым он имеет дело, они, вероятно, не должны создавать проблемы. Можно было бы ввести GUID во имя подпрограммы регистрации, если бы кто-то беспокоился о таких вещах.

Редактирование / добавление Чтобы быть ясным, цель этого – предоставить средства, с помощью которых различные отдельные classы могут позволить основной программе или classу узнать о них. Единственное, что основной файловый конвертер будет делать с zzFileConverterRegistrar, это создать один экземпляр и вызвать метод registerAll, который будет запускать событие Register. Любой модуль, который хочет подключить это событие, может выполнить произвольный код в ответ на него (вот и вся идея), но модуль не может сделать, ненадлежащим образом расширяя class zzFileConverterRegistrar, кроме определения метода, имя которого совпадает с чем-то другим , Было бы возможно, чтобы одно неправильно написанное расширение нарушило другое неправильно написанное расширение, но решение для этого – для тех, кто не хочет, чтобы его расширение было сломанным, чтобы просто написать его правильно.

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

   RegisterConverter («GIF», GifConvertor.NewFactory)
   RegisterConverter («BMP», BmpConvertor.NewFactory)
   RegisterConverter ("JPEG", JpegConvertor.NewFactory)

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

Частичные classы недавно помогли с контролем источника, когда несколько разработчиков добавляли в один файл, где новые методы были добавлены в одну и ту же часть файла (автоматизирован Resharper).

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

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

пример –

  • MainClass.cs – содержит поля, конструктор и т. Д.
  • MainClass1.cs – разработчик нового кода при их внедрении
  • MainClass2.cs – это еще один class разработчиков для их нового кода.

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

Например, давайте посмотрим на class C # System.Math … это class . Я бы не пытался использовать 70+ методов в одном и том же файле кода. Это будет кошмар для поддержания.

Размещение каждого математического метода в отдельных файлах частичного classа и всех файлов кода в Math-папке в проекте будет значительно более чистой организацией.

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

Лично я также разделяю то, что большинство людей называют classами «помощник» или «полезность» в отдельные частичные файлы для каждой функциональной группы метода или метода. Например, в одном проекте class хелпера содержит почти 50 методов. Это будет длинный громоздкий файл кода даже с использованием регионов. Для каждого метода значительно проще поддерживать отдельные файлы отдельных classов.

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

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

Из MSDN :

1. Время компиляции, атрибуты определений частичного типа объединяются. Например, рассмотрите следующие объявления:

 [SerializableAttribute] partial class Moon { } [ObsoleteAttribute] partial class Moon { } 

Они эквивалентны следующим объявлениям:

 [SerializableAttribute] [ObsoleteAttribute] class Moon { } 

Следующие элементы объединены со всеми определениями частичного типа:

  • Комментарии XML

  • интерфейсы

  • атрибуты параметров универсального типа

  • атрибуты classа

  • члены

2. Другое дело, вложенные частичные classы также могут быть частичными:

 partial class ClassWithNestedClass { partial class NestedClass { } } partial class ClassWithNestedClass { partial class NestedClass { } } 

Вот список некоторых преимуществ частичных classов.

Вы можете отделить код дизайна пользовательского интерфейса и код бизнес-логики, чтобы его было легко читать и понимать. Например, вы разрабатываете веб-приложение с помощью Visual Studio и добавляете новую веб-форму, тогда есть два исходных файла: «aspx.cs» и «aspx.designer.cs». Эти два файла имеют один и тот же class с неполным ключевым словом. Класс .aspx.cs имеет код бизнес-логики, тогда как «aspx.designer.cs» имеет определение управления пользовательским интерфейсом.

При работе с автоматически созданным источником код может быть добавлен в class без необходимости воссоздавать исходный файл. Например, вы работаете с LINQ to SQL и создаете файл DBML. Теперь, когда вы перетаскиваете таблицу, он создает неполный class в файле designer.cs, и все столбцы таблицы имеют свойства в classе. Вам нужно больше столбцов в этой таблице для привязки к сетке пользовательского интерфейса, но вы не хотите добавлять новый столбец в таблицу базы данных, чтобы вы могли создать отдельный исходный файл для этого classа, у которого есть новое свойство для этого столбца, и оно будет быть частичным classом. Таким образом, это влияет на сопоставление между таблицей базы данных и сущностью DBML, но вы можете легко получить дополнительное поле. Это означает, что вы можете написать код самостоятельно, не вникая в сгенерированный системой код.

Более одного разработчика могут одновременно написать код для classа.

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

Всякий раз, когда у меня есть class, который содержит вложенный class, который имеет какой-либо существенный размер / сложность, я отмечаю class как partial и помещаю вложенный class в отдельный файл. Я называю файл, содержащий вложенный class, с помощью правила: [имя classа]. [Имя вложенного classа] .cs.

В следующем блоге MSDN объясняется использование частичных classов с вложенными classами для удобства обслуживания: http://blogs.msdn.com/b/marcelolr/archive/2009/04/13/using-partial-classes-with-nested-classes-for- maintainability.aspx

Я знаю, что этот вопрос действительно старый, но я просто хотел бы добавить свое занятие в частичные classы.

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

Например, OpenGL – это конечный автомат, есть куча методов, которые могут быть изменены во всем мире, однако, по моему опыту, связывая нечто похожее с OpenGL, где существует так много методов, class может легко превышать 10 000 LOC.

Частичные classы сломают это для меня и помогут мне быстро найти методы.

Частичные classы в основном вводятся, чтобы помочь генераторам кода, поэтому мы (пользователи) не теряем всю нашу работу / изменения в сгенерированные classы, такие как class .designer.cs ASP.NET, каждый раз, когда мы регенерируем, почти все новые инструменты, которые генерируют код LINQ, EntityFrameworks, ASP.NET используют частичные classы для сгенерированного кода, поэтому мы можем безопасно добавлять или изменять логику этих сгенерированных кодов, используя преимущества classов и методов Partial, но будьте очень осторожны, прежде чем добавлять материал в сгенерированный код, используя Partial classes его легче, если мы сломаем сборку, но хуже, если мы представим ошибки времени выполнения. Для получения дополнительной информации проверьте это http://www.4guysfromrolla.com/articles/071509-1.aspx

  • Что я не понимаю в REST?
  • Какова реальная разница между «Bastard Injection» и «Injection для бедных»,
  • Как вы организуете свои небольшие повторные работы?
  • Что такое объект передачи данных?
  • Является ли NodeJS действительно однопоточным?
  • Выбор типа инъекции зависимостей
  • Преимущество создания общего репозитория против конкретного репозитория для каждого объекта?
  • Когда Редису? Когда в MongoDB?
  • Архитектура Java EE. Являются ли DAO по-прежнему рекомендуемыми при использовании ORM, таких как JPA 2?
  • Зачем нам RESTful Web Services?
  • На 32-битных процессорах, является ли «целочисленный» тип более эффективным, чем «короткий»?
  • Interesting Posts

    Переместить каждые 7 столбцов в новую строку в Excel

    objective ACTION_VIEW для файла с неизвестным MimeType

    Строка Java, разделенная на “.” (Точка)

    Почему Chrome устанавливается непосредственно в каталог пользователя вместо файлов программы?

    Как создать сегмент, который можно вызвать с помощью кнопки, созданной программно?

    NetworkStream.ReadAsync с маркером отмены никогда не отменяет

    Как установить траекторию инструмента SGEN в Msbuild для целевой среды 3.5

    Как отменить файл, проверенный в Clearcase?

    Правильный способ сохранить объединенные соединения в живых (или время их выхода и получить свежие) в течение более длительного времени бездействия для MySQL, приложение Grails 2

    Какое максимальное разрешение поддерживается стандартным адаптером DVI-VGA?

    Как преобразовать currentTimeMillis в дату на Java?

    Содержимое WebKit CSS Unicode?

    Эквивалент DownThemAll для Chrome

    Сохранять широковещательный приемник после закрытия приложения

    Путь к classу, включая JAR в JAR

    Давайте будем гением компьютера.