Metody get_ i set_

7

Właściwości (properties) to przyjemny mechanizm do zapewniania enkapsulacji, czyli jednej z najważniejszych cech programowania obiektowego. Przyjemniejszy niż zwykłe metody zwane “getters & setters”. Zwrócę jednak uwagę na ciekawy fakt (zapewne znany większości czytelników, ale…). Popatrzmy na następujący kod:

 1:   private int _number;
2: public int Number
3: {
4: get { return _number; }
5: set { _number = value; }
6: }
7:
8: public int get_Number()
9: {
10: return 0;
11: }
12:
13: public void set_Number(int number)
14: {
15: }

Z jednej strony znana wszystkim doskonale właściwość, z drugiej – zwykłe metody nie mające z nią nic wspólnego poza taką samą nazwą poprzedzoną przedrostkami get_ i set_.
Co otrzymamy przy próbie kompilacji? Błąd (różny w zależności od wersji kompilatora)! Powód? Otóż “pod spodem”, w mrocznych i strasznych flakach Języka Pośredniego, właściwości to nic innego jak… tworzone w locie getters & setters wywoływane w odpowiednim momencie:

 [MSIL]
1: .property instance int32 Number()
2: {
3: .get instance int32 ConsoleApplication1.Program::get_Number()
4: .set instance void ConsoleApplication1.Program::set_Number(int32)
5: }

Oczywiście to samo dotyczy “automatycznych właściwości” wprowadzonych w C# 3.0.

Nie przegap kolejnych postów!

Dołącz do ponad 9000 programistów w devstyle newsletter!

Tym samym wyrażasz zgodę na otrzymanie informacji marketingowych z devstyle.pl (doh...). Powered by ConvertKit
Share.

About Author

Programista, trener, prelegent, pasjonat, blogger. Autor podcasta programistycznego: DevTalk.pl. Jeden z liderów Białostockiej Grupy .NET i współorganizator konferencji Programistok. Od 2008 Microsoft MVP w kategorii .NET. Więcej informacji znajdziesz na stronie O autorze. Napisz do mnie ze strony Kontakt. Dodatkowo: Twitter, Facebook, YouTube.

7 Comments

  1. Czyli co, wychodzi na to, ze piszac zwykla wlasciwosc czy odpowiednie metody (get i set) wychodzi na to samo? Czy moze jest jakas roznica w predkosci?

  2. Wychodzi na to samo – z pewnością wydajność nie powinna być kwestią rozstrzygającą jeżeli chodzi o użycie metod vs użycie właściwości. Właściwości są po prostu bardziej praktyczne.

  3. fromasz! on

    tak sobie czytam Twoj blog od poczatku i musze powiedzc ze to swietna sprawa i wielu ciekawostek mozna sie tu dowiedziec. (nie od poczatu istnienia blogu, tylko od wczoraj ale od konca :)) pozdrawiam

  4. Mam takie pytanko…
    Czasami widze w kodzie cos takiego:
    public string Path { get; set; }

    Co oznacza taki kod?
    Dzieki za wyjasnienie…

  5. @Bonk:
    Są to tzw "automatic properties". Zostały wprowadzone w C# 3.0. Kompilator zamieni je na normalne [g|s]ettery. To co napisales jest rownowazne z:

    private string _path;
    public string Path
    {
    get { return _path; }
    set { _path = value; }
    }