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
- Tipi valore e tipi riferimento
- Boxing e unboxing
- Conversioni implicite ed esplicite
- La classe Convert e il parsing