Skip to content

Instantly share code, notes, and snippets.

@pjastr
Last active October 18, 2017 11:38
Show Gist options
  • Save pjastr/f6ce02d68cbc8eb03211ed2ec7c6a935 to your computer and use it in GitHub Desktop.
Save pjastr/f6ce02d68cbc8eb03211ed2ec7c6a935 to your computer and use it in GitHub Desktop.

Właściwości (ang. property) - niektórzy po polsku nazywają je propercjami.

Do tej pory składnia naszego kodu wyglądała następująco:

    class Osoba
    {
        private string imie;
        private int wiek;
        public void UstawWiek(int wiek) { this.wiek = wiek; }
        public int PobierzWiek() { return wiek; }
        public void UstawImie(string imie) { this.imie = imie; }
        public string PobierzImie() { return imie; }
    }

W metodzie Main klasy Program wyglądało to tak:

 Osoba osoba1 = new Osoba();
 osoba1.UstawWiek(21); //długo

A nie było dostępu do pól bezpośrednio z uwagi na hermetyzację:

 osoba1.wiek = 21; //niedostępne

Czym są zatem właściwości?

  • specjalna konstrukcja języka C# pozwalająca połączyć zachowanie pól i metod
  • wyglądają jak pola więc możemy pobrać ich wartość bądź je przypisać, a jednocześnie zachowują się jak metody czyli możemy stosować je w interfejsach

Z poziomu Visual Studio najłatwiej stworzyć prywatne pole i wybrać opcję z Menu (lub z prawego klawisza myszy):

refaktoryzacja

Druga opcja to wpisanie propfull i naciśnięcie Tab.

Składnia właściwości:

 private int wiek; //pole
 public int Wiek //właściwość
 {
 get { return wiek; }
 set { wiek = value; }
 }

Zwróć uwagę na dwie rzeczy:

  • nazwa pola (z małej litery) a nazwa właściwości (z dużej)
  • value – występuję tylko we wnętrzu set

Użycie właściwości dla obiektu:

 Osoba osoba1 = new Osoba();
 osoba1.Wiek = 21; //set
 Console.WriteLine(osoba1.Wiek); //get 

Skrócona deklaracja:

 class Osoba
 {
        public int Wiek { get; set; }
 }

Uwaga: przy skróconej deklaracji w trybie Debug jest to widoczne z ikoną klucza francuskiego:

prop-debug

Właściwość tylko do odczytu:

        private int wiek;
        public int Wiek
        {
            get
            {
                return wiek;
            }
        }

Właściwość tylko do zapisu:

        private int wiek;
        public int Wiek
        {
            set
            {
                wiek = value;
            }
        }

Dobra praktyka wg MSDN:

  • ilość kodu/instrukcji umieszczonych we właściwościach powinniśmy ograniczyć do minimum
  • dopuszczalne są jedynie „proste” operacje

Dostępność właściwości:

  • domyślne powielany jest modyfikator dostępu właściwości dla get i set, ale można go nadpisać
        public int Wiek
        {
            private get { return wiek; }
            set { wiek = value; }
        }
  • nie możemy nadpisać obu jednocześnie (lepiej zmienić modyfikator właściwości)
        public int Wiek
         {
             private get { return wiek; }
             private set { wiek = value; }
         }

Powyższy kod skutkuje błędem kompilacji.

  • modyfikatory dla get i set nie mogą być bardziej dostępne niż modyfikator samej właściwości
        private int Wiek
        {
            public get { return wiek; }
            set { wiek = value; }
        }

Pola czy właściwości – co używać?

  • właściwości nie mogą być użyte przy słowach kluczowych ref i out
 Osoba osoba1 = new Osoba();
 int.TryParse("21", out osoba1.Wiek); 
  • właściwości nie mogę być stałymi
  • możemy także zainicjować obiekt dzięki właściwościom
Osoba osoba1 = new Osoba() { Wiek = 22 };

Dalsze własności pojawią się pojęciu interfejsu i polimorfizmu.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment