Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

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

Таким образом, чтобы это частичные методы всегда возвращали 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

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

Ответ 2

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

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

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

Ответ 3

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


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

Ответ 4

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

Ответ 5

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

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