Tag Archives: roz

Metody częściowe(partial methods)

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ń.