• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

c# get set (problem z zrozumieniem)

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
+3 głosów
20,080 wizyt
pytanie zadane 17 maja 2015 w C# przez achilles147 Dyskutant (9,580 p.)
Witam :)

Piszę ponieważ nie umiem sobie dobrze wyjaśnić na czym dokładnie polegają funkcję get i set w języku c#. Czy mógłby mi ktoś to łopatologicznie wytłumaczyć?;p

6 odpowiedzi

+17 głosów
odpowiedź 17 maja 2015 przez Bartek85 Mądrala (7,440 p.)
wybrane 2 czerwca 2015 przez achilles147
 
Najlepsza

Mam prośbę do osób które udzielają odpowiedzi w formie jakiś strzępów informacji... Może lepiej tego nie robić? Moim zdaniem odpowiedz na każde pytanie trzeba wyczerpać do końca, a jak ktoś się nie czuję na siłach, to niech tego nie robi.

Set przypisuje wartość zmiennej, Get pobiera tą wartość. Prościej się nie da, nie ma tu żadnej filozofii :)

Kolego, właśnie Cię tutaj zaskoczę,  bo taki setter i getter w jezyku C# nie powstał bez powodu...

Zastosowanie setterów i getterów służy do enkapsulacji i spójności danych.


1) Pole publiczne c# w tym przypadku nie mamy żadnych setterów i getterów.

    public class MyClass
    {
        public MyClass()
        {
            MyInt = 0;
        }
        public int MyInt;
    }

w tym przypadku, każdy ma bezpośredni dostęp do naszego pola w klasie. Każdy może wpisywać tam dowolne dane, oraz je odczytywać. Jest to rozwiązanie "mocno" średnie. Oczywiście, czasami zamierzenie programisty jest takie, ale z reguły kończy się to źle... Samowolka jest zła!


2) Uzywając własności(Property), tutaj zaczynają mieć role settery i gettery, możemy zarządzać dostępem do naszego pola w klasie.

    public class MyClass
    {
        public MyClass()
        {
            MyPropertyInt = 0;
        }
        public int MyPropertyInt { get; set; }
    }

W tym przypadku pole MyProperty zostanie automatycznie zamienione na własność(Property). Właśnośc(Property) to nic innego jak pole, z dodatkowym mechanizmem do zapisu(set), oraz do czytania(get). W/w przykład działa tak samo jak przykład pierwszy. Nic się nie zmieniło. Nadal każdy ma dostęp do zmiennej MyPropertyInt, może ją zapisywac w dowolny sposób, oraz odczytywac kiedy tylko chce. Nic się nie zmieniło, więc rozwiązanie nadal jest "mocno" średnie.


3) Uzycie Własności(Property), z różnym mechanizmem dostępu. Może mój przykład nie będzie najwyższych lotów, ale chodzi o zasadę, a nie wymyślne przykłady...

Załóżmy, że chcemy mieć klasę która posiada pole, które może przyjmowac wartość <0, 10>. Każda inna wartość jest nie poprawna. W C++ musielibyśmy mieć dwie osobne metody jedna która ustwia pole ze sprawdzaniem danych, oraz inna która pobiera wartośc z pola. Mało intuicyjne rozwiązanie. W C#, dzięki własnością(Property) można to zrobić w bardzo ładny i szybki sposób. Poniżej przykład:

public class MyClass
    {
        private int _myInternalInt;

        public MyClass()
        {
            _myInternalInt = 0;
        }

        public int MyPropertyInt
        {
            get
            {
                return _myInternalInt;
            }
            set
            {
                if (value < 0 || value > 10)
                    throw new ArgumentOutOfRangeException("New value is out of range. Avaiable range is <0, 10>");
                _myInternalInt = value;
            }
        }
    }

Dzięki temu, mamy pewność, że nikt zpoza klasy MyClass nie ustawi złej wartości. Bardzo zgrabne rozwiązanie.


3) Kojeny przykład zalet używania mechanizmu set/get w języku c#.

Założmy, że chcemy mieć pole w klasie które może być ustawiane tylko z poziomu klasy. Uzytkownik który będzie korzystał z naszej klasy, może tylko odczytywac tą wartość, ale nie może jej zapisywać. Ponizej przedstawiam przykład:

public class MyClass
    {
        private int _myInternalInt;

        public MyClass()
        {
            _myInternalInt = 0;
        }

        public int MyPropertyInt
        {
            get
            {
                return _myInternalInt;
            }
            private set
            {
                if (value < 0 || value > 10)
                    throw new ArgumentOutOfRangeException("New value is out of range. Avaiable range is <0, 10>");
                _myInternalInt = value;
            }
        }
    }

W takim przypadku ustawiamy setter jako prywatny i nikt z zewnatrz, nam nie zaburzy stanu naszej klasy. Oczywiście przykladów można by mnożyć bez końca, ale chciałem tylko przedstawić zarys możliwości setterów i getterów w języku C#.  Oczywiścia gorąco zachęcam do czytania dokumentacji msdn.

1
komentarz 7 sierpnia 2015 przez Adam Nowicki Obywatel (1,600 p.)
Super wytłumaczenie :) Może troche odkop, ale dla pokoleń dodałbym, że:
zmiennaMain=Zmienna._myInternalInt // get
Zmienna._myInternalInt = 1// set
+2 głosów
odpowiedź 17 maja 2015 przez Tomasz90 Nałogowiec (25,140 p.)
Tutaj jest bardzo szczegółowo wytłumaczone:

http://www.p-programowanie.pl/c-sharp/wlasciwosci-akcesory-get-set/
0 głosów
odpowiedź 17 maja 2015 przez Bantu Nałogowiec (34,250 p.)

Można powiedzieć, że get i set to zachowania w momencie gdy zmienna jest wywoływana albo gdy do zmiennej jest przypisywana jakaś wartość.

W momencie gdy np.

var zmienna = 5;

to zostaje wywołany akcesor set, który definiuje jakieś zachowanie, więc powiedzmy może tam być coś co w momencie przypisania do zmiennej 5 to zmienna może faktycznie przyjąć inną wartość niż 5, a zdefiniowaną a akcesorze set.
W momencie gdy chcemy wywołać zmienną to zostaje wywołany akcesor get, który też definiuje jakieś zachowanie. To tak dość ogólnie opisałem, więcej zrozumiesz gdy będziesz ogólnie trochę więcej programował nie tylko w .NET ;)

0 głosów
odpowiedź 17 maja 2015 przez Strategiusz Dyskutant (9,220 p.)
edycja 17 maja 2015 przez Strategiusz

get i set to słowa kluczowe w C#. Służą do tworzenia tzw. property (po polsku właściwość), czyli takich jakby ładniej wyglądających funkcji SetCośtam(wartość) i GetCośtam(), bo własnie nie trzeba mieć w tych funkcjach słowa set ani get, ani nawet nawiasów. Z wyglądu nie różni się to od tego jakby to była po prostu zmienna publiczna.

A unikanie zmiennych publicznych bierze się głównie z dwóch powodów:

  1. Funkcja pozwala umieścić w sobie jakieś dodatkowe instrukcje (sprawdzające coś czy zabezpieczające przed czymś).
  2. W programowaniu zespołowym pozwala na unikaniu błędów spowodowanych tym, że ktoś z zespołu nie wie jak używać jakiejś klasy, a tak to wie, że może używać tylko tych metod, a reszta to wewnętrzne mechanizmy klasy, która sobie sama ich używa.

W prostych programach pisanych przez jedną osobę enkapsulacja wydaje się bezsensowna i często taka jest.

–2 głosów
odpowiedź 17 maja 2015 przez CzlowiekSkrypt Nałogowiec (26,340 p.)
Set przypisuje wartość zmiennej, Get pobiera tą wartość. Prościej się nie da, nie ma tu żadnej filozofii :)
–2 głosów
odpowiedź 17 maja 2015 przez Tymon Owczarek Nowicjusz (240 p.)
Warto zacząć że nie są to do końca funkcje tylko akcesory. Używa się ich przy hermetyzowaniu klas. Deklarujesz prywatna zmiena x, następnie właściwość X z akcesorami get i set okreslające pobieranie i ustawianie wartości zmiennej x.

Podobne pytania

0 głosów
0 odpowiedzi 216 wizyt
pytanie zadane 14 grudnia 2017 w C# przez Caspariano Użytkownik (760 p.)
+1 głos
2 odpowiedzi 788 wizyt
pytanie zadane 21 listopada 2015 w C# przez emSon Stary wyjadacz (10,480 p.)
0 głosów
1 odpowiedź 311 wizyt
pytanie zadane 6 września 2015 w C# przez Ceki Mądrala (5,310 p.)

93,439 zapytań

142,431 odpowiedzi

322,674 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...