2014-11-17 11 views
6

Sto imparando C# da uno sfondo Java e ho avuto una certa confusione su ValueType s. La mia comprensione dalla lettura della panoramica di MSDN C# vs Java era che le primitive sono oggetti invece di avere wrapper. Se questo è il caso, perché hanno bisogno di essere boxed per chiamare i metodi? Sembra che significhi qualcosa di diverso rispetto al boxing automatico di Java, ma non sono sicuro di cosa. Sembra più un casting.Qual è il significato di "Boxing" in C# (al contrario di Java)?

risposta

10

La boxe è un concetto molto simile in Java e C#. La differenza è quando succede:

Character ch = 'a'; 

questo farà sì che la boxe in Java, perché 'a' è primitiva e caratteristica è di classe (involucro). In C# questo:

Char ch = 'a'; 

non causerà la boxe perché Char non è un tipo primitivo, ma è il valore-tipo di classe. Per causare il pugilato in C# è necessario eseguire il cast dell'oggetto di valore sul riferimento object.

object o = 'a'; 

Edit: Come già detto da HighCore in commento, v'è un'importante implicazione del meccanismo di boxe in C#. L'inserimento di materiale in List<int> non causa il pugilato e l'estrazione di materiale non provoca il disimballaggio perché l'elenco di ints è un elenco reale di inbox unboxed.

+2

Penso che sia anche importante menzionare a un nuovo arrivato da java, che i generici di C# sono progettati correttamente e non esiste nulla come "cancellazione di tipo" e altri abomini a cui potrebbe essere abituato da java, e che creare un elenco 'è totalmente valido in C#. –