Me di cuenta de que en Microsoft .NET Framework el tipo de devolución void
es una estructura. ¿Por qué?¿Por qué Void es una estructura?
...
public void TestMethod()
{
}
...
Me di cuenta de que en Microsoft .NET Framework el tipo de devolución void
es una estructura. ¿Por qué?¿Por qué Void es una estructura?
...
public void TestMethod()
{
}
...
El marco utiliza a value type called System.Void
para representar la palabra clave void
tipo de retorno para su uso con la reflexión. Aunque void
significa la falta de un valor de retorno, sigue siendo técnicamente un tipo, y para que se exprese como tal en el código tiene que ser una estructura (tipo de valor) o una clase (tipo de referencia).
Consulte MethodInfo.ReturnType
para ver un ejemplo.
En cuanto a por qué los diseñadores de frameworks eligieron hacer System.Void
una estructura y no una clase que nadie pueda adivinar, pero tiene que estar representada por un tipo en primer lugar. Estoy de acuerdo con los comentarios de que es para evitar la sobrecarga innecesaria típicamente asociada con las búsquedas de referencia, entre otras optimizaciones.
Mi "mejor suposición" es que querían que se viera, al código de inspección, lo más cerca posible como algo que devuelve 0 bytes. Una estructura sin campos tiene 0 bytes, donde, como referencia de clase, es 4 u 8. Aunque es importante, en el nivel IL obviamente no devuelve nada, y tratar de "explotar" esos 0 bytes provocaría un error de verificación IL. –
Lectura adicional: http://ahuwanya.net/blog/post/Exploring-SystemVoid-Part-I.aspx http://ahuwanya.net/blog/post/Exploring-SystemVoid-Part-II.aspx – Strelok
Curiosamente , Parece que no puedo encontrar la declaración real de 'struct Void' en ninguna parte de la fuente de referencia. Por lo general, dan una pequeña explicación para este tipo de cosas en los comentarios de origen. –
Creo que el op es confundir la palabra clave [void] (http://msdn.microsoft.com/en-us/library/yah0tteb (v = vs.80) .aspx) y el [System.Void] (http://msdn.microsoft.com/en-us/library/system.void.aspx) estructura utilizada en Reflection. – Strelok
De hecho, el punto clave aquí: un método 'void' ** does not ** (en términos de IL) devuelve algo. Si escribió IL que intentó leer o "pop" el valor devuelto por dicho método, entonces la CLI (y PEVerify) le diría que ha destruido la pila. –
Los diseñadores de Rx también incluyeron una estructura para ['Unit'] (http://msdn.microsoft.com/en-us/library/system.reactive.unit (v = vs.103)), para lo que sea que sea valor. Posiblemente para estar en línea con 'Void'. – ligos