2011-01-19 13 views
10

Le mie domande sono:In C#, l'uso di tipi di valore vs tipi di riferimento

  • Quando dovremmo usare tipi di valore e quando i tipi di riferimento?
  • Quali sono i vantaggi e gli svantaggi di uno rispetto all'altro?
  • E se si utilizzano tipi di riferimento ovunque? C'è qualche danno in esso?

Si prega inoltre di discutere vantaggi e svantaggi di ciascuno. Voglio capirlo anche io.

+2

Se non puoi decidere, è quasi certamente un 'classe'. È incredibilmente raro * legittimamente * scrivere una struttura. –

+1

Per i programmatori turchi, ho un post sul blog http://sonergonul.net/2012/12/net-icerisinde-deger-tipi-ve-referans-tipi/ –

risposta

4

Sembra che ci sia molta confusione su questo, e Jon Skeet fa un buon lavoro di compensazione nel suo libro "C# In Depth, 2nd Ed." (sezione 2.3).

Il mio approccio personale, che può o non può essere corretto, è SOLO usare le strutture/enumerazioni (tipi di valore) per rappresentare strutture di dati atomici leggere che so che userò frequentemente in qualche tipo di logica o matematica operazioni - pensare Point, ecc.

In questo modo, posso evitare di penalizzare le prestazioni di raccolta dei dati inutili. Tuttavia, Jon sottolinea in quella sezione del suo libro che non c'è alcuna garanzia reale, specialmente nelle nuove versioni del runtime, se qualcosa andrà in pila.

Quindi la mia migliore risposta è usare le cose come le strutture con parsimonia ed essere molto consapevoli del motivo per cui le stai usando se lo fai. Attenzione per l'ottimizzazione prematura. E leggi quella sezione nel libro di Jon se riesci a metterti le mani su una copia, perché fa un buon lavoro nel chiarire l'intero argomento.

correlati: When to use struct?

7

Utilizzare tipi di valore per immutables che non hanno un'identità propria (un 1 è un 1), utilizzare tipi di riferimento per altre cose.

+5

Le stringhe devono avere identità? :) –

+0

Quindi un '" 1 "' non è un '" 1 "'? – jason

+0

@Jon - caso speciale ... e si potrebbe sostenere che le stringhe avrebbero dovuto essere implementate come tipi di valore. Mi piacerebbe sentire la tua opinione su di esso. – Oded

9

È necessario utilizzare i tipi di valore per i piccoli, tipi immutabili che rappresentano valori.
Never make mutable structs.

Per tutto il resto, utilizzare i tipi di riferimento.

+1

+1 con enfasi su * piccolo *. (copia-su-assegnazione) –

+1

il tuo post non spiega perché si dovrebbero usare i tipi di valore? – Nawaz

2

http://www.albahari.com/valuevsreftypes.aspx

questo è il mio riferimento su questo punto. Principalmente uso i tipi di riferimento tbh. Classi IE e non strutture. Il punto principale che viene spesso detto è che le strutture dovrebbero essere utilizzate solo per piccole informazioni. Dipende davvero dalle circostanze esatte. Dai un'occhiata al framework .net nel browser degli oggetti che dovrebbe aiutarti, vedrai cosa hanno fatto i ragazzi di microsoft e potrai analizzare il motivo per cui hanno creato determinate classi e strutture.

1

Immutable tipi di valore e tipi di riferimento immutabili sono semanticamente quasi identica; le uniche differenze sono che i tipi di riferimento supportano controlli di uguaglianza di riferimento che possono o non possono essere significativi, e che i tipi di valore possono essere avvolti in un Nullable (Of T) mentre i tipi di riferimento sono implicitamente annullabili. Se un tipo sarà immutabile, a seconda di come verrà utilizzato, potrebbero esserci motivi di rendimento per favorire una struttura o una classe; le strutture sono più veloci per alcune operazioni (quasi tutte le operazioni, per dimensioni inferiori a quattro byte), mentre le classi potrebbero essere più veloci per alcune altre (specialmente per le cose più grandi di 16 byte). Inoltre, alcuni tipi di operazioni sono essenzialmente impossibili con le strutture.

I tipi di strutture mutevoli sono utili, contrariamente a quanto affermano alcuni oppositori, ma ci sono alcuni avvertimenti. Se uno ha una variabile che contiene un riferimento a un oggetto di classe mutabile, e uno fa qualcosa per cambiare quell'oggetto, quel cambiamento sarà effettivamente "visto" da tutto ciò che contiene un riferimento a quell'oggetto. Se si desidera cambiare un oggetto senza disturbare qualcos'altro, si deve sapere che si detiene l'unico riferimento a quell'oggetto. Spesso l'unico modo per essere sicuri di ciò è copiare tutti i dati dall'oggetto in una nuova istanza di oggetto e quindi apportare la modifica alla nuova istanza. Al contrario, se uno ha una struttura mutevole, si può semplicemente fare qualunque modifica si desideri senza dover creare una nuova istanza.

L'unico vero problema con le strutture mutevoli è che .NET utilizza varie astrazioni per renderli comportarsi come parte del sistema di tipo unificato, e queste astrazioni può provocare copie di strutture da utilizzare in luoghi dove logicamente dovrebbero essere utilizzati gli originali . Non è sempre ovvio quando queste sostituzioni possono verificarsi e possono portare a comportamenti confusi ed errati.