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