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.
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?
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.
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
Dzięki, radość ma nie zna granic;)
Mam takie pytanko…
Czasami widze w kodzie cos takiego:
public string Path { get; set; }
Co oznacza taki kod?
Dzieki za wyjasnienie…
@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:
Dzieki za wyjasnienie.
pozdrawiam