Как частичные методы используются в C# 3.0?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
18
0
7 929
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Генерация кода - одна из основных причин их существования и одна из основных причин их использования.


Обновлено: Несмотря на то, что эта ссылка относится к информации, относящейся к Visual Basic, те же основные принципы применимы и к C#.

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

Частичные методы очень похожи по концепции на шаблон поведения GoF Шаблонный метод (Шаблоны проектирования, p325).

Они позволяют определять поведение алгоритма или операции в одном месте и реализовывать или изменять в другом месте, обеспечивая расширяемость и настройку. Я начал использовать частичные методы в C# 3.0 вместо шаблонных методов, потому что я считаю, что код чище.

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

Да, действительно! Какая удивительная вещь - один человек (ты) что-то видишь, а другой - нет (я)

zzfima 17.11.2016 16:01

Вот лучший ресурс для частичных классов в C# .NET 3.0: http://msdn.microsoft.com/en-us/library/wa80x488(VS.85).aspx

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

Ответ принят как подходящий

Частичные методы были введены по тем же причинам, что и частичные классы в .Net 2.

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

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

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

  • В .Net 1 это был автоматически сгенерированный код в блоке #region.
  • В .Net 2 они стали отдельными классами дизайнера - форма по-прежнему является одним классом, он просто разделен на один файл, редактируемый разработчиками, и один - дизайнером форм.

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

В .Net 3.5 был представлен Linq. Linq имеет конструктор DBML для построения ваших структур данных, который генерирует автоматический код.

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

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

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

Пустые методы не оптимизированы.

Итак, Linq генерирует пустые частичные методы. Если вы не создадите собственный партиал для их завершения, компилятор C# просто оптимизирует их.

Чтобы он мог это сделать, частичные методы всегда возвращают void.

Если вы создадите новый файл Linq DBML, он автоматически сгенерирует частичный класс, что-то вроде

[System.Data.Linq.Mapping.DatabaseAttribute(Name = "MyDB")]
public partial class MyDataContext : System.Data.Linq.DataContext
{
    ...

    partial void OnCreated();
    partial void InsertMyTable(MyTable instance);
    partial void UpdateMyTable(MyTable instance);
    partial void DeleteMyTable(MyTable instance);

    ...

Затем в своем частичном файле вы можете расширить это:

public partial class MyDataContext
{
    partial void OnCreated() {
        //do something on data context creation
    }
}

Если вы не расширите эти методы, они сразу же будут оптимизированы.

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

Пример, который я упомянул ранее, является одной из возможностей:

//this code will get optimised out if no body is implemented
partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
//this code won't exist if the flag is off
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

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

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

TheXenocide 06.10.2008 22:22

@Keith «Частичные методы не могут быть общедоступными - тогда они должны быть там для вызова других классов» Я думаю, что это ограничение недействительно, например, в моем проекте у меня около 15 методов в классе, и для большей читабельности я хочу сохранить их в частичных классах, но, поскольку я не могу определить их общедоступными, я вынужден держать их в одном классе.

user348675 24.05.2010 09:18

Другие вопросы по теме