[c#] Po co akcesory?

0
 
class Przykład
{
	private int m_Zmienna;
	
	public int Zmienna
	{
		set { m_Zmienna = value; }
		get { return m_Zmienna; }
	}
}

Jaki jest sens istnienia takiego akcesora, bo ja żadnego nie widzę. Czy nie lepiej w takim przypadku po prostu stworzyć bezpośrednio public int Zmienna? Druga sprawa czy jeżeli mamy akcesor, to czy korzystamy z:

 class Przykład
{
	private int m_Zmienna;
	
	public int Zmienna
	{
		set { m_Zmienna = value; }
		get { return m_Zmienna; }
	}
	
	public void ZrobCos()
	{
		m_Zmienna = 7;
	}
	
	public void ZrobCosJeszcze()
	{
		Zmienna = 77;
	}
}

Tak jak w ZróbCoś, czy jak w drugiej metodzie? W moim odczuciu skoro mamy akcesor to powinniśmy z niego korzystać, bo przecież w przyszłości możemy dodać warunek że:

set { if ( value < 0 ) m_Zmienna = 0; }

Czy coś w ten deseń. Jak Wy zapatrujecie się na to zagadnienie? Według mnie tworzenie (swoją drogą zbędnego) akcesora i niekorzystanie z niego ("bo mamy dostęp do m_Zmienna") jest co najmniej nielogiczne. Tak mnie dręczy po przejrzeniu kodu kolegi.

0

A co jeśli np. m_Zmienna ma przyjmować wartości tylko z zakresu \left&lt;-\pi;\pi\right)? Wtedy właśnie do akcji wkraczają akcesory. Ich zadaniem jest sprawdzenie czy przypisana zmienna ma poprawną wartość już w momencie przypisania.

0

Rozumiem to ale widząc kod w którym autor odwołuje się bezpośrednio do m_Zmienna, to nabrałem wątpliwości i dlatego żeby upewnić się że to niepoprawne ten temat.

0

Najlepiej pisać w C# 3.0 i tworzyć proste właściwości w skróconej formie (bez pól) i nie zastanawiać się nad tym.
A na pytanie "a po co są właściwości?" odpowiada się pytaniem: "a po co są funkcje?".

0

Gdy pewnego dnia stwierdzisz, że pole danej klasy jednak musi być większe od 0, to nie trzeba będzie zmieniać i szukać po całym kodzie, tylko dodajesz sprawdzanie w set{} i po sprawie ;]. Ja mam publiczne wyłącznie właściwości, a to z dość dziwnego powodu, że Microsoft przyjął taką konwencję w swoich bibliotekach i jakoś pole w podpowiedziach intelisense mi "brzydko wygląda" ;)

0

właściwości (a nie pola) są też potrzebne tam, gdzie środowisko IDE dokonuje jakiejś automatyzacji, np. przy tworzeniu usług WCF. z jakiegoś powodu działają tylko właściwości, pola nie.

1

IMHO prefiks m_ słabo wygląda. Ja bym dał:

private int m_prefixbegin__private_int_in_class_Przyklad_project_Testowy666_used_for_storing_some_type_of_values__prefixend___variablenamebegin_nazwaZmiennej_variablenameend;

Od razu czytelniej wygląda, i nawet nie trzeba IntelliSense używać. I jest się zgodnym z zasadą mówiącą o tym, że nazwy zmiennych powinny się same komentować. No i jest węgierska bardziej niż Balaton wypełniony po brzegi gulaszem i leczo.

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