Gyakorlat – Érték- és hivatkozástípus-paraméterek használata

Befejeződött

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

  1. A Visual Studio Code Editorban törölje a meglévő kódot az előző gyakorlatokból.

  2. Í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és c a rendszer átadja a Multiply metó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 c kimenete?

  3. 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 = 0
    

    Figyelje meg, hogy a c értéke csak a Multiply metóduson belül módosul. A metóduson kívül c megőrzi az eredeti értékét.

Tesztátvétel hivatkozás alapján

  1. Törölje az előző kódot a Visual Studio Code Editorból.

  2. Í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 array kezdődik, és egész számértékeket tartalmaz. Az értékek a PrintArray metódus használatával jelennek meg. A Clear metó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?

  3. Mentse és futtassa a kódot a következő kimenet megfigyeléséhez:

    1 2 3 4 5 
    0 0 0 0 0
    

    Figyelje meg, hogy a tömb a metódus hatókörén Clear kívül is változik. Ez azért történik, mert a Clear metó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.

  1. A Visual Studio Code Editorban törölje a meglévő kódot az előző gyakorlatokból.

  2. Í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}");
    }
    
  3. Mentse és futtassa a kódot a következő kimenet megfigyeléséhez:

    Start: Healthy
    Middle: Unhealthy
    End: Healthy
    

    Ha a SetHealth metó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.

  4. 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 status változót az új szöveges értékkel.

  5. Mentse és futtassa a kódot a következő kimenet megfigyeléséhez:

    Start: Healthy
    Middle: Unhealthy
    End: Unhealthy
    

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