2013-07-10 13 views
10

AFAIK void significa nulla in termini di linguaggio di programmazione. Quindi, perché nel framework .Net è dichiarato come struct?Perché il tipo di reso non è stato dichiarato come struct in .NET?

using System.Runtime.InteropServices; 

namespace System 
{ 
    /// <summary> 
    /// Specifies a return value type for a method that does not return a value. 
    /// </summary> 
    /// <filterpriority>2</filterpriority> 
    [ComVisible(true)] 
    [Serializable] 
    [StructLayout(LayoutKind.Sequential, Size = 1)] 
    public struct Void 
    { 
    } 
} 

risposta

15

System.Void è effettivamente un tipo di marcatore - membri piace MethodInfo.ReturnType avere qualche modo di rappresentare void, e System.Void è il modo in cui il team di .NET scelto di farlo.

Non dovresti usarlo come un tipo normale. È una soluzione efficace, un po 'come lo F# Unit type, ma non completamente integrata nel sistema di tipi.

+0

ty per una risposta così gentile signore! –

+0

se void fosse ben integrato in .net invece di usarlo come soluzione alternativa, non avrebbe fornito prestazioni migliori? –

+1

@AppDeveloper, non penso che possa influire sulle prestazioni, in realtà controlla solo il modo in cui le funzioni vengono compilate e se restituiscono un valore oppure no. Le funzioni C# Void, o VB Subs, non restituiscono valori, quindi il codice IL per spingere/scoppiare i valori di stack per questo viene semplicemente omesso. – Kratz

2

Un descrittore di metodo contiene un campo per il tipo di ritorno del metodo. Mentre sarebbe possibile che tale campo sia null per le funzioni void, che richiederebbe quel codice che desidera ad es. Tipo di rapporto ritorno del metodo di dire qualcosa come:

string theReturnType = theMethod.ReturnType ? theMethod.ReturnType.ToString() : "null"; 

piuttosto che semplicemente dicendo:

string theReturnType = theMethod.ReturnType.ToString(); 

ci sono abbastanza casi in cui il codice ha a che fare qualcosa con il tipo di ritorno del metodo che dover special-case nullo in tutti loro sarebbe molto più difficile avere semplicemente un tipo fittizio "null" che può essere restituito.

Per inciso, anche se per quanto ne so void è l'unico tipo che è utilizzabile per un valore di ritorno del metodo ma nessun altro scopo, ci sono altri casi in cui sarebbe utile avere un tipo che potrebbe essere utilizzato per il pubblico ritorno valori, ma non utilizzati in dichiarazioni di posizione di archiviazione esterne, come quando si scrive un'interfaccia fluente (se il codice esterno potrebbe essere autorizzato ad accedere ai membri di biz.boz(3), ma non è possibile memorizzare il valore stesso, quindi in un costrutto come biz.boz(3).foo(9).bar(2).build(), il metodo foo potrebbe sapere che ha mantenuto l'unico riferimento in qualsiasi parte dell'universo all'oggetto restituito da boz(3) e sarebbe quindi libero di modificarlo o restituire una nuova istanza, a proprio piacimento).