2012-07-16 11 views
22

Mi sono reso conto che nel Microsoft .NET Framework il tipo di ritorno void è una struttura. Perché?Perché Void è una struttura?

... 
public void TestMethod() 
{ 

} 
... 
+2

Penso che l'op confonda la parola chiave [void] (http://msdn.microsoft.com/en-us/library/yah0tteb (v = vs80) .aspx) e il [System.Void] (http://msdn.microsoft.com/en-us/library/system.void.aspx) struttura utilizzata in Reflection. – Strelok

+6

In effetti, il punto chiave qui: un metodo 'void' ** non ** (in termini IL) restituisce qualcosa. Se hai scritto IL che ha provato a leggere o "popare" il valore restituito da tale metodo, allora la CLI (e PEVerify) ti direbbero che hai impantanato lo stack. –

+0

I progettisti di Rx sono andati anche con una struttura per ['Unit'] (http://msdn.microsoft.com/en-us/library/system.reactive.unit (v = vs.103)), per quello che è di valore. Forse per rimanere in linea con 'Void'. – ligos

risposta

28

Il quadro utilizza a value type called System.Void per rappresentare il tipo di parola chiave void di ritorno per l'utilizzo con la riflessione. Sebbene void significhi la mancanza di un valore di ritorno, è ancora tecnicamente un tipo, e per poter essere espresso come tale nel codice deve essere una struttura (tipo di valore) o una classe (tipo di riferimento).

Vedere MethodInfo.ReturnType per un esempio.

Per quanto riguarda il motivo per cui i progettisti del framework hanno scelto di rendere System.Void una struttura e non una classe è indovinata da nessuno, ma deve essere rappresentata da un tipo in primo luogo. Sono d'accordo con i commenti che è quello di evitare il sovraccarico non necessario in genere associato con ricerche di riferimento, tra le altre ottimizzazioni.

+17

La mia "ipotesi migliore" è che volevano che guardasse, al codice di ispezione, il più vicino possibile a qualcosa che restituisse 0 byte. Una struct senza campi è 0 byte, dove -come un riferimento di classe è 4 o 8. Sebbene sia importante, a livello di IL ovviamente non restituisce nulla, e provare a "popare" quegli 0 byte causerebbe un errore di verifica dell'IL. –

+0

Letture addizionali: http://ahuwanya.net/blog/post/Exploring-SystemVoid-Part-I.aspx http://ahuwanya.net/blog/post/Exploring-SystemVoid-Part-II.aspx – Strelok

+0

Interessante , Non riesco a trovare la dichiarazione effettiva di 'struct Void' in nessun punto della fonte di riferimento. Di solito danno una piccola spiegazione per questo genere di cose nei commenti sorgente. –

Problemi correlati