C#-ban mi a külömbség az értéktípus, és a referencia között?
Mit változtat ha egyikkel,vagy másikkal adom meg egy áltozó értékét?Vagy a referencia nem ezt jelenti csak az értéktípusban lehet értéket adni?
köszi aki segít
Az hogyha a fuggveny csinal valamit a valtozoval (modositja), akkor a valtozonak megmarad-e a korabbi erteke, vagy pedig modosul?
Referencia eseten nem marad meg az erteke. Ertektipuskor megmorzi az eredeti erteket (mert a fuggveny nem az igazi valtozot kapta meg csak egy masolatot).
Pelda:
void Method(ref int refArgument)
{
refArgument = refArgument + 44;
}
int number = 1;
Method(ref number);
Console.WriteLine(number); // 45-ot fog kiirni, de ha elhagyjuk a ref kulcsszot akkor meg 1-et ir ki
Kösszönöm szépen,bár több sort nem értek még a progidból,az első kettőt sem,de most tanulgatom a nyelvet.Csak a könyvem egyáltalán nem tér ki semmiféle részletre sem.
Köszönöm a választ.ment a zöld pipa
A lényeg az, hogy az értéktípusok másolódnak:
int Eredeti = 5;
int Uj = a;
//Most az 5 kétszer szerepel a memóriában
Uj = 3;
Console.WriteLine(Eredeti); //Azt fogom látni, hogy 5 - mivel a másolatot módosítottam, nem az eredetit.
Ezzel szemben a referenciatípusok úgy viselkednek, hogy egyszer létrejönnek a memóriában, majd az az információ másolódik le, hogy hol található az érték a memóriában.
class Sample { int Value; }
Sample Eredeti = new Sample;
Eredeti.Value = 5;
Sample Uj = a;
//A Sample osztályunk példánya továbbra is csak egyszer szerepel a memóriában
Uj.Value = 3; //Mivel csak egyszer létezik, ennek hatása lesz az Eredeti-re is
Console.WriteLine(Eredeti); //Azt fogom látni, hogy 3, mivel az eredetit módosítottam.
A .NET az érték- és referenciatípusok tárolására két külön memóriaterületet használ. Az értéktípusok a stack-nek nevezett memóriaterületen tárolódnak, míg a referenciatípusok a heap-en. A kettő között az a különbség, hogy a stack esetében egy érték addig létezik, amíg a hatásköréből a program ki nem lép:
if (true) {
.. int valami = 5;
}
Az if vezérlési szerkezet legvégén a "valami" változóhoz rendelt érték azonnal felszabadul, mivel stack-en van tárolva.
if (true) {
.. object valami = new object();
}
Ebben az esetben a "new object()" utasítás hatására a heap-en létrejön egy System.Object példány, majd a stack-en ennek a memóriabeli címét tárolja a valami változóban. Bár a stack-en tárolt memóriacím azonnal megszűnik az if szerkezet végén, a heap-en tárolt System.Object példány még egy darabig a memóriában marad. Hogy ne neked kelljen foglalkozni a törlésével (merthogy amúgy a te dolgod lenne), egy Garbage Collectornak nevezett dolog időnként végignézi a heap-et és törli azokat az objektumokat, amire a stack-en nincs referencia.
C#-ban az érték- és a referenciatípus nagyon egyszerűen különböztethető meg:
- minden struct értéktípus (pl. System.Int32 azaz int, System.Double azaz double, ...)
- minden class referenciatípus
Bár az utolsó válasz sem tiszta,igazából megértettem pár dolgot belőle. tehát tulajdonképpen arról van szó,hogy az egyiket addig hazsnálja a program,amig monduk egy osztáloyn belül van,míga másik végleges marad.bár lehet baromságot hordtam össze. azt még nem tudom,hogy a pont hogyan kerül oda,(Eredeti.value),és a value sem tudom mi,az ifet sem ismerem.No sebaj,mostantól úgyis elárasztom a kérdéseimmel a fórumot,mert jó lenne ezt a nyelvet megtanúlni, azt hallottam,hogy a referencia értéke is magas.
Mint a php,java,css,c++,visual basic
ilyesmiket mondtak,hogy lérdemes,meg persze a c# .
Utobbi mellett döntöttem.
Igyekszem az alapokat,csak ugye a könyv megy tovább,a magyarázatokat később ígéri,én meg szeretem tudni,mi történik az adott forrásban éppen.
üdv
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!