C# LanguageTipo di valore vs Tipo di riferimento


Sintassi

  • Passando per riferimento: public void Double (ref int numberToDouble) {}

Osservazioni

introduzione

Tipi di valore

I tipi di valore sono i più semplici dei due. I tipi di valore sono spesso usati per rappresentare i dati stessi. Un numero intero, un punto booleano o un punto nello spazio 3D sono tutti esempi di buoni valori.

I tipi di valore (structs) sono dichiarati usando la parola chiave struct. Vedere la sezione della sintassi per un esempio su come dichiarare una nuova struttura.

In generale, abbiamo 2 parole chiave che vengono utilizzate per dichiarare i tipi di valore:

  • Structs
  • enumerazioni

Tipi di riferimento

I tipi di riferimento sono leggermente più complessi. I tipi di riferimento sono oggetti tradizionali nel senso della programmazione orientata agli oggetti. Quindi, supportano l'ereditarietà (e i benefici che ne derivano) e supportano anche i finalizzatori.

In C # generalmente abbiamo questo tipo di riferimento:

  • Classi
  • I delegati
  • interfacce

Nuovi tipi di riferimento (classi) sono dichiarati usando la parola chiave class. Per un esempio, vedere la sezione della sintassi su come dichiarare un nuovo tipo di riferimento.

Major Differences

Di seguito sono riportate le principali differenze tra tipi di riferimento e tipi di valore.

Esistono tipi di valore nello stack, esistono tipi di riferimento sull'heap

Questa è la differenza spesso menzionata tra i due, ma in realtà, ciò a cui si riduce è che quando si utilizza un tipo di valore in C #, ad esempio un int, il programma utilizzerà quella variabile per fare riferimento direttamente a quel valore. Se dici int mine = 0, la variabile mine si riferisce direttamente a 0, che è efficiente. Tuttavia, i tipi di riferimento effettivamente contengono (come suggerisce il nome) un riferimento all'oggetto sottostante, questo è simile ai puntatori in altri linguaggi come C ++.

Potresti non notare immediatamente gli effetti di questo, ma gli effetti sono lì, sono potenti e sono sottili. Vedere l'esempio sulla modifica dei tipi di riferimento altrove per un esempio.

Questa differenza è la ragione principale per le seguenti altre differenze, e vale la pena conoscere.

I tipi di valore non cambiano quando li si cambia in un metodo, i tipi di riferimento lo fanno

Quando un tipo di valore viene passato in un metodo come parametro, se il metodo modifica il valore in qualsiasi modo, il valore non viene modificato Al contrario, passando un tipo di riferimento nello stesso metodo e cambiandolo si cambia l'oggetto sottostante, in modo che altre cose che usano lo stesso oggetto avranno l'oggetto appena cambiato piuttosto che il loro valore originale.

Vedi l'esempio dei tipi di valore rispetto ai tipi di riferimento nei metodi per maggiori informazioni.

Cosa succede se voglio cambiarli?

Semplicemente passali nel tuo metodo usando la parola chiave "ref", e quindi stai passando questo oggetto per riferimento. Significato, è lo stesso oggetto in memoria. Quindi le modifiche che apporti saranno rispettate. Vedere l'esempio sul passaggio per riferimento per un esempio.

I tipi di valore non possono essere nulli, i tipi di riferimento possono

Praticamente come si dice, è possibile assegnare un valore nullo a un tipo di riferimento, nel senso che alla variabile assegnata non può essere assegnato alcun oggetto reale. Nel caso di tipi di valore, tuttavia, ciò non è possibile. Tuttavia, puoi usare Nullable, per consentire al tuo tipo di valore di essere annullabile, se questo è un requisito, anche se questo è qualcosa che stai considerando, pensa fortemente se una classe potrebbe non essere l'approccio migliore qui, se è il tuo genere.

Tipo di valore vs Tipo di riferimento Esempi correlati