Z klasami częściowymi większość programistów c# prawdopodobnie miała już styczność. Klasycznym przykładem jest rozbicie klasy Form na część wygenerowaną przez Visual Studio oraz na część przeznaczoną do modyfikacji przez programistę. Metody częściowe są bardzo podobnym mechanizmem. W skrócie są to metody, które można definiować w dwóch różnych plikach. Zdecydowałem się o nich napisać ponieważ wydaje mi się, że są mniej znane, a czasami mogą okazać się przydatne.
Sama deklaracja jest analogiczna do klas częściowym. W jednym pliku deklarujemy metodę:
// Plik A partial void Method();
W drugim pliku możemy zdefiniować ciało metody:
// Plik B partial void Method() { MessageBox.Show("Metoda czesciowa"); }
Mechanizm pozwala nam na definicję metody w innym pliku niż jej deklaracja. Metody częściowe mają jedną wyróżniającą cechę – wszelkie wywołania są usuwane na etapie kompilacji w przypadku gdy programista nie zdefiniował ciała tej metody. Dzięki temu kod jest optymalny ponieważ w sytuacji gdy nie było potrzeby definiowania metody, wszelkie wywołania będą usuwane w czasie kompilacji, co skutkuje, że plik końcowy nie będzie zawierał żadnych śladów tej metody.
Metody częściowe najczęściej wykorzystuje się w generatorach kodu. W takim przypadku nie chcemy aby użytkownik kodu modyfikował kod automatycznie wygenerowany(mogło by to zakłócić poprawne działanie tworzonego narzędzia programistycznego). Z drugiej jednak strony, chcemy aby użytkownik mógł modyfikować w jakimś stopniu działanie klasy. Możemy więc zdefiniować pewne metody częściowe, które będą wywoływane w odpowiednich momentach. Użytkownik klasy chcąc wpłynąć na działanie klasy mógłby definiować ciała metod częściowych. Oczywiście podobny rezultat można osiągnąć poprzez dziedziczenie i metody wirtualne, jednak metody częściowe są znacznie bardziej optymalne i przeważnie łatwiejsze w użyciu. Wszystko zależy jednak od konkretnego przypadku użycia – metody częściowe stanowią dodatek a nie próbę zastąpienia dotychczasowych rozwiązań.
Dodalbym tylko, że partial methods pojawiły się w c# 3.0 (.NET 3.5)