(C#)Miért preferálják a property-t a mezők helyett?
Most tanulok OOP-t és rengeteg érettségi megoldásban, meg egyéb videóban látom hogy úgy írják meg az osztályt hogy azonnal egy jellemzőt hoznak létre és majd az kapja meg a konstruktorban átadott értéket. Arra lennék kíváncsi hogy ez miért jó és jobb mintha egy sima tagváltozónak adnám át az értéket? Remélem nem kérdezek hülyeséget, de tényleg nem régóta kezdtem tanulni, viszont ez nagyon érdekel!
Egy példa rá:
tagváltozóval:
public string cim;
Propertyvel:
public string Cim {get;}
A példádban már autoproperty van, az egy kicsit még kényelmesebb (így nem is kell neked megírnod a get metódust).
Az OOP szerint (egységbe zárás elve pl.) egy osztályváltozó (adattag) az osztály magánügye, így érdemes private hozzáférésűnek beállítani, és pl. csak getter/setter metódusokon keresztül közvetve, ellenőrzötten engedni elérni őt.A Property is jól követi ezt az elvet, elegánsabb használata talán.
Propertyn keresztül amúgy lehet pl. mező értékét kiolvasni vagy állítani, de lehet mező nélkül is dolgozni akár pl. egy számítást elvégeztetni.
Miért kell getter/setter?
Vegyük ezt az osztályt:
class Person
{
public int age;
}
Ha példányosítod, és át akarod írni a korát könnyen megteheted:
Person person = new Person();
person.age = 20;
De mi van akkor, ha valaki valami extrémet ad meg? Pl.:
person.age = 500;
vagy
person.age = -10;
Ilyenkor jönne az az ötlet, hogy nem kéne engedni, hogy kívülről ilyen könnyen manipulálják a változódat, vagyis jobb lenne egy függvényen keresztül inkább. Itt jön képbe a setter:
class Person
{
private int age;
public void setAge(int age)
{
if(age >= 0 && age <=100)
this.age = age;
else
Console.WriteLine("Hiba")
{
}
Most képzeld el azt, hogy minden helyen, ahol most "person.age =" át kell írnod "person.setAge()"-re. Jobb lett volna már az elején így csinálni.
Na a property az nem helyettesítő a szokásos adattag + getter/setter megoldást, de sok esetben megkönnyíti, rövidebb kódot eredményez.
Hogy miért nem helyettesíthető? Mert van olyan eset, hogy te, osztályon belül nem szeretnéd, hogy lefusson a getter vagy setter, amikor változtatsz egy adattagon.
Ilyenkor szoktak csinálni backing fieldet:
class Person
{
private int _age;
public Age { get { return _age; }; set { _age = value }; }
}
Bocs, ha van szintatikai hiba, nagyon régen c#-oztam.
Oh, még annyit hozzátennék, hogy a saját magára történő rekurzív hívást is elkerülöd backing fielddel ha a getterben ellenőrzöl valamit rajta.
Majd a többiek kijavítják a maradékot, tényleg elfelejtettem mindent c#-ból...
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, 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!