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

Решение, написанное Бобингом, отлично работает для меня. Я хотел предложить альтернативный метод для будущих посетителей:

if (typeof(jQuery) == 'undefined') {
    (function() {
        var sct = document.createElement('script');
        sct.src = ('https:' == document.location.protocol ? 'https' : 'http') +
          '://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js';
        sct.type = 'text/javascript';
        sct.async = 'true';
        var domel = document.getElementsByTagName('script')[0];
        domel.parentNode.insertBefore(sct, domel);
    })();
}

В этом примере я включил условную нагрузку для jQuery, чтобы продемонстрировать пример использования. Надеюсь, это полезно для кого-то!

471
задан Naeem Ul Wahhab 21 November 2017 в 10:14
поделиться

9 ответов

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

0
ответ дан 22 November 2019 в 22:41
поделиться

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

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

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

8
ответ дан 22 November 2019 в 22:41
поделиться

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

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

MyProvider.cs — базовая логика

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

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

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

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

8
ответ дан 22 November 2019 в 22:41
поделиться

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

12
ответ дан 22 November 2019 в 22:41
поделиться

Прекрасное применение — отделение сгенерированного кода от написанного от руки кода, принадлежащего к одному классу.

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

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

55
ответ дан 22 November 2019 в 22:41
поделиться

Еще одно использование — разделение реализации различных интерфейсов, например:

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


partial class MyClass
{
    // implementation of IF1
}

partial class MyClass
{
    // implementation of IF2
}
247
ответ дан 22 November 2019 в 22:41
поделиться

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

Partial Public Class zzFileConverterRegistrar
    Event Register(ByVal mainConverter as zzFileConverter)
    Sub registerAll(ByVal mainConverter as zzFileConverter)
        RaiseEvent Register(mainConverter)
    End Sub
End Class

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

Partial Public Class zzFileConverterRegistrar
    Private Sub RegisterGif(ByVal mainConverter as zzFileConverter) Handles Me.Register
        mainConverter.RegisterConverter("GIF", GifConverter.NewFactory))
    End Sub
End Class

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

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

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

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

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

4
ответ дан 22 November 2019 в 22:41
поделиться

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

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

404
ответ дан 22 November 2019 в 22:41
поделиться

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

11
ответ дан 22 November 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: