0Pricing
C# Academy · Lezione

Tipi valore e tipi riferimento

Scopra come vengono memorizzati e copiati.

Tipi valore e tipi riferimento è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.

Due famiglie di tipi

I tipi C# si dividono in tipi valore, come int, double, bool e le struct, e tipi riferimento, come classi, stringhe e array. Si distinguono per il modo in cui vengono memorizzati e copiati.

using System;

class Program
{
    static void Main()
    {
        int valueType = 5;          // value type
        int[] referenceType = { 1, 2, 3 };  // reference type
        Console.WriteLine(valueType + ", length " + referenceType.Length);
    }
}

I tipi valore contengono i dati

Una variabile di tipo valore contiene direttamente i propri dati. In genere questi risiedono nello stack oppure direttamente all'interno dell'oggetto che li contiene.

using System;

class Program
{
    static void Main()
    {
        int a = 10;
        double b = 3.14;
        bool c = true;
        Console.WriteLine(a + ", " + b + ", " + c);
    }
}

I tipi riferimento contengono un indirizzo

Una variabile di tipo riferimento contiene un riferimento, cioè un indirizzo, ai dati memorizzati nell'heap. La variabile e l'oggetto sono entità separate.

using System;

class Box { public int Value; }

class Program
{
    static void Main()
    {
        Box b = new Box();   // b refers to a heap object
        b.Value = 42;
        Console.WriteLine(b.Value);
    }
}

Semantica della copia: tipi valore

Assegnare un tipo valore copia i dati. Modificare la copia non influisce mai sull'originale.

using System;

class Program
{
    static void Main()
    {
        int a = 1;
        int b = a;   // copy
        b = 99;
        Console.WriteLine("a=" + a + ", b=" + b);
    }
}

Semantica della copia: tipi di riferimento

L'assegnazione di un tipo di riferimento copia il riferimento, non l'oggetto. In seguito, entrambe le variabili puntano allo stesso oggetto.

using System;

class Box { public int Value; }

class Program
{
    static void Main()
    {
        Box a = new Box { Value = 1 };
        Box b = a;   // same object
        b.Value = 99;
        Console.WriteLine("a.Value=" + a.Value + ", b.Value=" + b.Value);
    }
}

Le struct sono tipi valore

Una struct definita dall'utente è un tipo valore, quindi viene copiata durante l'assegnazione, proprio come int.

using System;

struct Point { public int X, Y; }

class Program
{
    static void Main()
    {
        Point p1 = new Point { X = 1, Y = 2 };
        Point p2 = p1;   // full copy
        p2.X = 99;
        Console.WriteLine("p1.X=" + p1.X + ", p2.X=" + p2.X);
    }
}

Passaggio ai metodi

Per impostazione predefinita, i tipi valore vengono passati per copia, mentre i tipi di riferimento passano una copia del riferimento. Di conseguenza, un metodo può modificare un oggetto di classe visibile al chiamante, ma non un semplice int.

using System;

class Counter { public int N; }

class Program
{
    static void BumpInt(int x) { x++; }
    static void BumpObj(Counter c) { c.N++; }

    static void Main()
    {
        int i = 0;
        BumpInt(i);
        var c = new Counter();
        BumpObj(c);
        Console.WriteLine("i=" + i + ", c.N=" + c.N);
    }
}

null e tipi di riferimento

Solo i tipi di riferimento possono essere null (cioè l'assenza di un oggetto). I tipi valore contengono sempre un valore, a meno che non siano dichiarati nullable con ?.

using System;

class Program
{
    static void Main()
    {
        string text = null;        // reference type can be null
        int? maybe = null;          // nullable value type
        Console.WriteLine((text == null) + ", " + (maybe == null));
    }
}

Differenze nell'uguaglianza

Per i tipi valore, == confronta i dati. Per i tipi di riferimento, == confronta generalmente l'identità (lo stesso oggetto), a meno che non venga eseguito un override.

using System;

class Program
{
    static void Main()
    {
        int a = 5, b = 5;
        Console.WriteLine("ints: " + (a == b));   // True - same value

        object o1 = new object();
        object o2 = new object();
        Console.WriteLine("objects: " + (o1 == o2));   // False - different identity
    }
}

Valori predefiniti

I tipi valore hanno un valore predefinito simile a zero (0, false); per i tipi di riferimento il valore predefinito è null.

using System;

class Program
{
    static void Main()
    {
        int defaultInt = default;
        bool defaultBool = default;
        string defaultString = default;
        Console.WriteLine(defaultInt + ", " + defaultBool + ", null? " + (defaultString == null));
    }
}

Mettere tutto insieme

Sapere se un tipo è valore o riferimento consente di prevedere il comportamento della copia, la nullabilità e il modo in cui i metodi possono modificarlo. Questo è fondamentale per scrivere codice corretto e privo di bug.

using System;

struct Money { public decimal Amount; }
class Wallet { public decimal Amount; }

class Program
{
    static void Main()
    {
        Money m1 = new Money { Amount = 10 };
        Money m2 = m1; m2.Amount = 99;

        Wallet w1 = new Wallet { Amount = 10 };
        Wallet w2 = w1; w2.Amount = 99;

        Console.WriteLine("Money copy: " + m1.Amount + " (independent)");
        Console.WriteLine("Wallet ref: " + w1.Amount + " (shared)");
    }
}

Verifica rapida

Verifichi la comprensione dei tipi valore e dei tipi di riferimento.

Riepilogo

I tipi valore (int, double, bool, struct) memorizzano direttamente i dati e vengono copiati durante l'assegnazione; i tipi di riferimento (classi, stringhe, array) memorizzano un riferimento a un oggetto nell'heap e copiano il riferimento. Solo i tipi di riferimento sono nullable per impostazione predefinita; inoltre, il comportamento dell'assegnazione e il confronto di uguaglianza differiscono tra le due famiglie.

using System;

struct V { public int N; }
class R { public int N; }

class Program
{
    static void Main()
    {
        V v1 = new V { N = 1 }; V v2 = v1; v2.N = 9;
        R r1 = new R { N = 1 }; R r2 = r1; r2.N = 9;
        Console.WriteLine(v1.N + " vs " + r1.N);
    }
}

Domande Frequenti

La lezione «Tipi valore e tipi riferimento» è gratuita?

Sì — il testo completo di «Tipi valore e tipi riferimento» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.

Cosa imparerò in «Tipi valore e tipi riferimento»?

Scopra come vengono memorizzati e copiati. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Tipi valore e tipi riferimento»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Tipi valore e tipi riferimento
  2. Boxing e unboxing
  3. Conversioni implicite ed esplicite
  4. La classe Convert e il parsing
← Torna a C# Academy