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





Генерация кода - одна из основных причин их существования и одна из основных причин их использования.
Обновлено: Несмотря на то, что эта ссылка относится к информации, относящейся к Visual Basic, те же основные принципы применимы и к C#.
Я рассматриваю их как легкие события. У вас может быть многоразовый файл кода (обычно автоматически сгенерированный, но не обязательно), и для каждой реализации просто обрабатывайте события, которые вас волнуют, в частичном классе. Фактически, именно так он используется в LINQ to SQL (и почему была изобретена языковая функция).
Частичные методы очень похожи по концепции на шаблон поведения GoF Шаблонный метод (Шаблоны проектирования, p325).
Они позволяют определять поведение алгоритма или операции в одном месте и реализовывать или изменять в другом месте, обеспечивая расширяемость и настройку. Я начал использовать частичные методы в C# 3.0 вместо шаблонных методов, потому что я считаю, что код чище.
Одна приятная особенность заключается в том, что нереализованные частичные методы не требуют дополнительных затрат времени выполнения, поскольку они компилируются.
Вот лучший ресурс для частичных классов в C# .NET 3.0: http://msdn.microsoft.com/en-us/library/wa80x488(VS.85).aspx
Я стараюсь избегать использования частичных классов (за исключением частичных файлов, созданных Visual Studio для дизайнерских файлов; это здорово). Для меня важнее собрать весь код класса в одном месте. Если ваш класс хорошо спроектирован и представляет одну вещь (принцип единой ответственности), тогда весь код для этой одной вещи должен быть в одном месте.
Частичные методы были введены по тем же причинам, что и частичные классы в .Net 2.
Частичный класс - это класс, который можно разделить на несколько файлов - компилятор собирает их все в один файл по мере выполнения.
Преимущество этого состоит в том, что Visual Studio может предоставить графический дизайнер для одной части класса, в то время как кодировщики работают над другой.
Самый распространенный пример - конструктор форм. Разработчики не хотят большую часть времени размещать кнопки, поля ввода и т. д. Вручную.
#region.Это значительно упрощает обслуживание обоих. Слияние проще и меньше риск того, что конструктор форм 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
Другое возможное использование - если у вас есть большой и сложный класс, распределенный по нескольким файлам, вам могут понадобиться частичные ссылки в вызывающем файле. Однако я думаю, что в этом случае вам следует сначала подумать об упрощении класса.
Отличный ответ; чтобы добавить крошечную ценность, частичные классы также могут использоваться для добавления методов и функций к автоматически сгенерированным классам веб-служб.
@Keith «Частичные методы не могут быть общедоступными - тогда они должны быть там для вызова других классов» Я думаю, что это ограничение недействительно, например, в моем проекте у меня около 15 методов в классе, и для большей читабельности я хочу сохранить их в частичных классах, но, поскольку я не могу определить их общедоступными, я вынужден держать их в одном классе.
Да, действительно! Какая удивительная вещь - один человек (ты) что-то видишь, а другой - нет (я)