Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

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

Таким образом, Linq генерирует пустые частичные методы.Если вы не создадите свой собственный partial для их завершения, компилятор 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

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

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

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

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

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

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


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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top