Właściwości get i set

1

Nie rozumiem sensu istnienia właściwości get i set.
mamy klase:

public class Klasa
{
   private string zmienna;
   public zmienna {get; set;}

}

Jeśli za pomocą właściwości mamy dostęp do pola zmienna, to dlaczego nie dać modyfikatora public dla tej zmiennej i korzystać z niej bezpośrednio?

0

Ponieważ nie wszystkie zmienne powinny mieć taki status public, nie chcemy aby ktoś miał dostęp do własciwosci i je zmienial. Po drugie getery i setery porzadkuja klase.

0

Ponieważ np. w zmiennej zmienna jest przechowywany email i chcesz sprawdzać czy został podany poprawny.
Ponieważ np. w przyszłości zmieni Ci się koncepcja i w ogóle zrezygnujesz ze zmiennej zmienna i zastąpisz ją jakimiś 2 zmiennymi.
Ponieważ np. pojawi się potrzeba wyliczenia czegoś na podstawie zmienna, a nie chcesz tego liczyć za każdym razem jak będzie potrzebne tylko od razu po zmianie wartości zmiennej i przechowujesz to jako inna zmienna w obiekcie.

Przykłady można mnożyć i mnożyć... ;)

0
  1. Można bezproblemowo zmienić założenia gettera i settera bez kombinowania i grzebania bezposrednio w kodzie.
    • Masz, dajmy na to pole "Age" do ustawiania wieku. Możesz zrobić to w ten sposób:

public int Age;

albo

public int Age { get; set; }

Jesli kiedys dojdziesz do słusznego wniosku, że wiek powinien być większy od zera, mając własciwiosć, przerobisz to na:

public int Age
        {
            get
            {
                ...
            }
            set
            {
                if (value <= 0)
                {
                    throw new ArgumentOutOfRangeException();
                }
                ...
            }
        }
  1. Jesli chcesz sprawdzić kiedy jakakolwiek metoda próbuje odczytać/zmienić daną własciwosć wystarczy ustawić Breakpoint na getterze/setterze
  2. Własciwosci można używać do Databindingu, pól nie.
  3. Można zrobić cos takiego
public int Age {get; private set;}

Dzięki czemu metody wszystkich klas będą mogły odczytać wartosć ale tylko metody macierzystej klasy będą mogły ją zmieniać.

Tyle mi do głowy przychodzi. W małych programikach służących do nauki faktycznie często nie odczuwa się różnicy :)

0

bo np. możesz chcieć zrobić tak:

public class Klasa
{
   private string zmienna;
   private string pierwsza;
   private string ostatnia;
   public Zmienna {
   get
   {
       return zmienna;
   } 
   set
   {
       zmienna = value;
       pierwsza = zmienna.Substring(0, 1);
       ostatnia = zmienna.Substring(zmienna.Length-1, 1);
   }
   }
   public  Pierwsza { get{return pierwsza ?? "\0";}}
   public Ostatnia { get{return ostatnia ?? "\0";}}
} 
0

ok rozumiem, dzieki :)

0
j_s_r_n napisał(a)
   public  Pierwsza { get{return pierwsza ?? "\0";}}

Co to niby ma być to "\0"?

Dodam jeszcze od siebie, że w przypadku używania refleksji jest wygodniej jest np. przeszukiwać tylko po właściwościach niż po właściwościach i polach oddzielnie.
A poza tym - takie są po postu zalecania, standardy i konwencje.

0

Mam takie pytanie: której wersji akcesorów get\set powinno się używać? Bo obydwie są poprawne i program się skompiluje. Tylko nie wiem która jest lepsza z punktu widzenia dobrego programowania obiektowego.

Wersja 1:

private int zmienna;
public int Zmienna
{
      get { return zmienna; }
      set { zmienna = value; }
}

Wersja 2:
public int Zmienna { get; set; }

0

Z "punktu widzenia programowania obiektowego", to to samo. W drugiej wersji masz 4 razy mniej pisania, więc jest wygodniejsza. (A jak ktoś zna ten magiczny snippet prop to już w ogóle jest szczęśliwym człowiekiem. ;))
Oczywiście w tej wersji ustawisz jedynie wartość pola, nie zawrzesz dodatkowej logiki.

0

Obydwie wersje tak naprawdę robią dokładnie to samo, wersję "skróconą" kompilator sobie rozwija do tej pierwszej (a tą pierwszą następnie po prostu do wywołań metod).

1 użytkowników online, w tym zalogowanych: 0, gości: 1