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.