Как частичные методы используются в C # 3.0? - PullRequest
18 голосов
/ 03 сентября 2008

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

Ответы [ 5 ]

23 голосов
/ 04 сентября 2008

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

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

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

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

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

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

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

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

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

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

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

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

Так что он может делать это частичные методы всегда возвращать void.

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

[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

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

10 голосов
/ 03 сентября 2008

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

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

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

2 голосов
/ 03 сентября 2008

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

2 голосов
/ 03 сентября 2008

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


РЕДАКТИРОВАТЬ: Хотя эта ссылка относится к информации, относящейся к Visual Basic, те же основные принципы относятся к C #.

0 голосов
/ 03 сентября 2008

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

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

...