Mikor használjak field-et és mikor property-t C#?
Programozást tanulok de a tanárom ott le van ragadva hogy consolappba a main-be írogatunk már év eleje óta, rendkívül unalmas.
Mivel itthon vagyok, magamat szeretném oktatni, Winform-ban csinálok most egy projectet, amihez szükségem van egy int pontszám és egy bool start-ra. De field vagy property?
Field: p - astebin.com/TsqCi1hs
Property: p - astebin.co m/ZPcT0WTb
Vegyétek ki a " - " mert sajnos nem enged linket küldeni az oldal, kénytelen voltam így.
Ha jó a selytésem Property-t kellene használni itt, ugye? Bár Field-el is menne amúgy.
Valaki eltudná akár röviden magyarázni hogy mikor melyiket érdemes használni?
Leírom inkább ide a kódrészeket:
Field-el:
bool Start = false;
int Pont = 0;
public Form1()
{
InitializeComponent();
}
private void buttonStart_Click(object sender, EventArgs e)
{
Start = true;
//többi dolog
}
private void buttonEnd_Click(object sender, EventArgs e)
{
Pont++;
Start = false;
//többi dolog
}
Property-vel:
private bool Start { get; set; }
private int Pont { get; set; }
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Start = false; //bár lehet alapérték false de mind1 ez csak példa
Pont = 0;
}
private void buttonStart_Click(object sender, EventArgs e)
{
Start = true;
//többi dolog
}
private void buttonEnd_Click(object sender, EventArgs e)
{
Start = false;
Pont++;
//többi dolog
}
Szóval, amikor objektumorientáltan programozol, annak megvan az az egyik csodás hozománya, hogy kontrollálhatod a hozzáférést az adattagokhoz. A való életben is megfigyelhetsz ilyen példákat:
1) Nem nagyon van rá jogi lehetőség, hogy egy autó alvázszámát megváltoztasd. De ettől elolvasni még tudni kell.
2) több hirtelen nem jut az eszembe.
Ha mezőt (field) használsz, azzal teljesen kontrollálatlanul hagyod az adattagot. Ez azt jelenti, hogy bárki bármikor olyan értékre állítja, amilyenre kedve van (és amit a típus megenged). Például, ha az számodra egy teljesen szabályos eset, hogy egy tanulmányi rendszerben nyilvántartott hallgatónak 25000-es átlaga legyen (holott a valóságban ez ugye 1-től 5-ig terjed), akkor nyugodtan használj mezőt. Szóval a puszta mező hozzáférhetővé hagyása azt vonja maga után, hogy az objektumod szabálytalan állapotba kerülhet, a szerepét tekintve. Ez olyan, mintha egy pasit elneveznél Lillának. Az érték a típus lehetséges értékeinek szempontjából nézve szabályos, de az objektum szerepköre szerint, miszerint egy férfinak férfineve legyen, ez sérül.
A property akkor jön be a képbe, ha
1) szabályozni akarod, hogy ki módosíthatja az adattagot. Általában a lekérdezést (get) nyilvánosnak szokták hagyni, a set accessor elérhetőségét szokás korlátozni.
2) olyat akarsz csinálni, hogy a property értéke nem változhat az objektum létrehozása után. Ebben az esetben a set accessort nem írják le, ezzel read-only property-t hozva létre. Ez azt hiszem, C# 6-os feature.
3) oké, hogy hagyni akarod, hogy új értéket adjanak a propertynek, de ezt szeretnéd ellenőrzött körülmények közt csinálni. Például, egy magyar telefonszám ne kezdődjön már úgy, hogy +65 143...
4) a property értéke számított érték. Ebben az esetben a set accessort általában elhagyják, és a get accessorba írják le a számítás lépéseit.
Vannak ugyanakkor olyan körülmények, amik egyértelműen kikényszeríti a property-k használatát. Például ha WPF-ben fejlesztesz ablakos alkalmazást, a data binding csak property-ken működik.
fun fact:
Ha van egy ilyen property-d:
public int Something { get; set; }
Nem hozhatsz létre az osztályban olyan metódusokat, hogy
int Get_Something() => ...;
void Set_Something(int value) => ...;
Mert ezeket a metódusokat a fordító generálja a property alapján.
Köszi!
Tehát akkor amit írtam példát, ott a field-es megoldás jó, mert felesleges property. Legalábbis ezek alapján így értelmezem.
Azonban ha property-ként használom azt a boolt és intet, egy tapasztaltabb programozó szemében szálka lenne hogy fölöslegesen csináltam property-nek? Vagy úgy vannak vele az emberek hogy bár fölös de miért-ne így oké.
És ha osztályon belül használom csak és property-sen akkor az mennyire "szálka" egy másik programozó szemében amúgy?
Vagy ez oké?
Akkor van értelme úgy property-t használni, ha van több metódusod, és vigyázni kell arra, hogy milyen értéket adsz a property-nek. Például:
private int myField;
public void DoSomething(int value) {
.. if (value > 50 && value < 100) throw new ArgumentException(...);
.. myField = value;
.. //do something
}
public void DoSomethingElse(int value, string anotherParam) {
.. if (value > 50 && value < 100) throw new ArgumentException(...);
.. myField = value;
.. //do something else
}
Ilyen esetben érdemes property-t használni még csak belső használat esetén is, hogy elkerüld a kódduplikációt. Igaz, ettől még senki nem véd meg, hogy osztályon belül valami más közvetlenül hozzáférjen a háttérben megbújó mezőhöz.
Tehát akkor eleve property-t kell használnom mert a bool-nak kétszer (később még lehet többször) adok értéket.
Köszi a válaszaid!
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!