Mi sono reso conto che nel Microsoft .NET Framework il tipo di ritorno void
è una struttura. Perché?Perché Void è una struttura?
...
public void TestMethod()
{
}
...
Mi sono reso conto che nel Microsoft .NET Framework il tipo di ritorno void
è una struttura. Perché?Perché Void è una struttura?
...
public void TestMethod()
{
}
...
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.
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. –
Letture addizionali: http://ahuwanya.net/blog/post/Exploring-SystemVoid-Part-I.aspx http://ahuwanya.net/blog/post/Exploring-SystemVoid-Part-II.aspx – Strelok
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. –
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
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. –
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