Gyakorlat – Érték- és hivatkozástípus-paraméterek használata
A C#-ban a változók két fő típusba sorolhatók, értéktípusokra és referenciatípusokra. Ezek a típusok azt írják le, hogy a változók hogyan tárolják az értékeiket.
Az olyan értéktípusok, mint például inta , bool, float, doubleés char közvetlenül tartalmaznak értékeket. Az olyan referenciatípusok, mint string, array, és az objektumok (például Random példányai) nem tárolják közvetlenül az értékeiket. Ehelyett a hivatkozástípusok egy címet tárolnak, ahol az értéküket tárolják.
Érték szerint átadott és hivatkozással átadott paraméterek
Amikor egy argumentumot egy metódusnak ad át, az értéktípus változói a metódusba másolják az értékeiket. Minden változó saját másolatot készít az értékről, így az eredeti változó nem módosul.
Hivatkozástípusok esetén az érték címe bekerül a metódusba. A metódusnak adott változó az adott címen lévő értékre hivatkozik, így a változón végzett műveletek hatással vannak a másik által hivatkozott értékre.
Megjegyzés:
Fontos megjegyezni, hogy string ez egy referenciatípus, de nem módosítható. Ez azt jelenti, hogy az érték hozzárendelése után nem módosítható. A C#-ban, amikor metódusok és operátorok használatával módosít egy sztringet, a visszaadott eredmény valójában egy új sztringobjektum.
Ebben a gyakorlatban többet is megtudhat a referencia- és értéktípus-argumentumok metódusokba való átadásáról.
Próbaátvétel érték szerint
A Visual Studio Code Editorban törölje a meglévő kódot az előző gyakorlatokból.
Írja be a következő kódot a Visual Studio Code Editorba:
int a = 3; int b = 4; int c = 0; Multiply(a, b, c); Console.WriteLine($"global statement: {a} x {b} = {c}"); void Multiply(int a, int b, int c) { c = a * b; Console.WriteLine($"inside Multiply method: {a} x {b} = {c}"); }A változók
a,bésca rendszer átadja aMultiplymetódusnak. A változók értékeit a rendszer a metódus végrehajtása során nyomtatja ki, majd a metódus befejezése után újra kinyomtatja.Az egész számok olyan értéktípusok, amelyek értékeit átmásolják a metódusokba való továbbításkor. Mit gondolsz, mi lesz a
ckimenete?Mentse és futtassa a kódot a következő kimenet megfigyeléséhez:
inside Multiply method: 3 x 4 = 12 global statement: 3 x 4 = 0Figyelje meg, hogy a
cértéke csak aMultiplymetóduson belül módosul. A metóduson kívülcmegőrzi az eredeti értékét.
Tesztátvétel hivatkozás alapján
Törölje az előző kódot a Visual Studio Code Editorból.
Írja be a következő kódot a Visual Studio Code Editorba:
int[] array = {1, 2, 3, 4, 5}; PrintArray(array); Clear(array); PrintArray(array); void PrintArray(int[] array) { foreach (int a in array) { Console.Write($"{a} "); } Console.WriteLine(); } void Clear(int[] array) { for (int i = 0; i < array.Length; i++) { array[i] = 0; } }A kód inicializálással
arraykezdődik, és egész számértékeket tartalmaz. Az értékek aPrintArraymetódus használatával jelennek meg. AClearmetódus meghívása a tömbön történik, majd a tömb újra ki lesz nyomtatva.A tömbök referenciatípusok. A referenciatípusok az értékek címét a memóriában tárolják. Mit gondol, mi lesz a kimenet?
Mentse és futtassa a kódot a következő kimenet megfigyeléséhez:
1 2 3 4 5 0 0 0 0 0Figyelje meg, hogy a tömb a metódus hatókörén
Clearkívül is változik. Ez azért történik, mert aClearmetódus frissítette az egyes címeken tárolt értékeket.
Tesztelés sztringekkel
Korábban megtudta, hogy a sztringek nem módosíthatók típusúak. Annak ellenére, hogy egy sztring referenciatípus, az értéke nem módosítható a hozzárendelés után, ellentétben a tömbökkel. Lehet, hogy észrevette ezt, ha olyan metódusokat használt, mint a string.Replace vagy string.ToUpper. Ebben a feladatban megtanulhatja kijavítani a sztringek használatakor előforduló gyakori hibát.
A Visual Studio Code Editorban törölje a meglévő kódot az előző gyakorlatokból.
Írja be a következő kódot a Visual Studio Code Editorba:
string status = "Healthy"; Console.WriteLine($"Start: {status}"); SetHealth(status, false); Console.WriteLine($"End: {status}"); void SetHealth(string status, bool isHealthy) { status = (isHealthy ? "Healthy" : "Unhealthy"); Console.WriteLine($"Middle: {status}"); }Mentse és futtassa a kódot a következő kimenet megfigyeléséhez:
Start: Healthy Middle: Unhealthy End: HealthyHa a
SetHealthmetódus nem adta ki az állapotot, feltételezhette, hogy a metódus nem megfelelően fut. Ehelyett egy "Egészségtelen" értékű új sztring jött létre, majd elveszett a metódus hatókörében.A probléma megoldásához módosíthatja
SetHealthúgy, hogy a globális állapotváltozót használja.Frissítse a kódot az alábbiak szerint:
string status = "Healthy"; Console.WriteLine($"Start: {status}"); SetHealth(false); Console.WriteLine($"End: {status}"); void SetHealth(bool isHealthy) { status = (isHealthy ? "Healthy" : "Unhealthy"); Console.WriteLine($"Middle: {status}"); }Ebben a kódban felülírja a globális
statusváltozót az új szöveges értékkel.Mentse és futtassa a kódot a következő kimenet megfigyeléséhez:
Start: Healthy Middle: Unhealthy End: UnhealthyMost a frissített sztring rögzítése és tárolása megfelelően történik.
Összefoglalás
Az értéktípus és a referenciatípus paramétereiről eddig az alábbiakat tanulta:
- A változók értéktípusokként és referenciatípusokként kategorizálhatók.
- Az értéktípusok közvetlenül tartalmaznak értékeket, a referenciatípusok pedig az érték címét tárolják.
- Az értéktípus-argumentumokat használó metódusok saját másolatot hoznak létre az értékekről.
- A tömbparaméteren módosításokat végrehajtó metódusok hatással vannak az eredeti bemeneti tömbre.
- A sztring nem módosítható referenciatípus.
- A sztringparaméteren módosításokat végrehajtó metódusok nem befolyásolják az eredeti sztringet.