Kezdőoldal » Számítástechnika » Programozás » (C#)Miért preferálják a...

(C#)Miért preferálják a property-t a mezők helyett?

Figyelt kérdés

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;}



2021. márc. 28. 18:54
 1/5 anonim ***** válasza:
42%
Gyakorlatban nincs nagy különbség, viszont az az által, hogy tudsz get, privat set-et állítani jobban követi az oop-t.
2021. márc. 28. 18:57
Hasznos számodra ez a válasz?
 2/5 anonim ***** válasza:
40%

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.

2021. márc. 28. 19:17
Hasznos számodra ez a válasz?
 3/5 Alex Fly ***** válasza:
Alapvetően egy class adattagjai az OOP elvek szerint privátok és a propertyvel biztosítod, hogy a megadott adattagokat - és csak azokat- elérd az osztályon kívülről. És olyankor is jól jöhet, ha egy osztályban az adott adatot nem olyan formában tárolod, mint ahogyan azt a program többi részében felhasználod.
2021. márc. 29. 04:49
Hasznos számodra ez a válasz?
 4/5 anonim ***** válasza:
100%

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.

2021. márc. 29. 11:30
Hasznos számodra ez a válasz?
 5/5 anonim ***** válasza:

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...

2021. márc. 29. 11:35
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!