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