Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

206
Vistas
¿Cuál fue la razón de diseño para hacer que el vacío no fuera un tipo primitivo?

Cuando se usa la reflexión Type.IsPrimitive en un tipo void devuelve false. Viniendo de un fondo de C ++, esto fue sorprendente.

Mirando la especificación C# 6.0 (Página 82) no menciona el tipo void , lo que podría significar que no está categorizado como un tipo por completo.

¿Hay algo en la especificación del idioma o de otro modo que categorice void como otra cosa? ¿O alguna otra discusión o similar que mencione la razón detrás de esto?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

¿Por qué void no es un tipo primitivo? Porque no es algo que puedas instanciar. No es un tipo primitivo, ni un tipo de referencia. No es nada en absoluto.

Eric Lippert describe algunos 'problemas' con el tipo void en esta publicación sobre ingeniería de software , que aborda los detalles de void como un tipo para usar en delegados y Action s:

Un sistema de tipos es esencialmente un sistema para hacer deducciones lógicas sobre qué operaciones son válidas en valores particulares; un método de devolución nulo no devuelve un valor, por lo que la pregunta "¿qué operaciones son válidas en esta cosa?" no tiene ningún sentido en absoluto. No hay "cosa" sobre la que haya una operación, válida o no válida.

Convertirlo en un tipo primitivo anula el significado especial y el propósito del void en el VES (Sistema de Ejecución Virtual), como explica Eric más adelante:

El efecto de una llamada a un método void es fundamentalmente diferente al efecto de una llamada a un método no void; un método no nulo siempre pone algo en la pila, que podría necesitar ser sacado. Un método void nunca pone algo en la pila.

Hacer que void un tipo primitivo rompe esta regla, aunque podría argumentar su utilidad, como explica Eric más adelante en la publicación a la que se hace referencia.

over 4 years ago · Santiago Trujillo Denunciar

0

void no es un tipo, es una palabra clave . Al igual que en C++, significa exactamente lo mismo. Las palabras clave juegan un papel destacado en un lenguaje, solo pueden aparecer en ciertos lugares y el analizador puede hacer suposiciones difíciles sobre la intención del programador.

La función principal es generar buenos mensajes de error. Obvio en una sentencia como return 42; en un método declarado nulo, obtienes un mensaje de error claro como "oye, dijiste que no devolverá nada". Menos obvio es que son muy útiles para recuperarse de errores básicos de sintaxis, por ejemplo, la falta de una llave de cierre } es un error bastante difícil de recuperar. Cuando el analizador encuentra void mientras analiza el cuerpo de un método, puede restablecer el estado del analizador y comenzar a generar buenos mensajes de error nuevamente.

Que el tipo System.Void exista es una peculiaridad relacionada con los metadatos. El equivalente aproximado de un archivo .h en C++. Existen principalmente para hacer frente a las restricciones técnicas en C++, no tiene concepto de módulos, utiliza un modelo de compilación de un solo paso y exige que las declaraciones siempre aparezcan antes que las definiciones. Un trabajo bastante doloroso en C++, aunque las herramientas del editor pueden ayudar un poco. No existen tales restricciones en C#, el compilador genera la declaración a partir de la definición.

Los metadatos describen un método en detalle, almacenados en registros MethodDef y MethodDefSig en los metadatos. Dos formas básicas en que los diseñadores de CLR podrían haber expresado la noción de "este método no devuelve datos". Una forma obvia es que podrían haber usado un poco en la enumeración MethodAttributes , algo así como "HasNoReturnValue". Pero dado que muchos métodos tienen un tipo de devolución no nulo, y el espacio para él está reservado en el registro MethodDefSig de todos modos, simplemente eligieron un valor centinela como el tipo de devolución. Sistema.Vacío.

Por lo general, no es útil reflexionar sobre el tipo System.Void. Siendo realistas, podrían haber elegido cualquier valor para IsPrimitive y no habría hecho ninguna diferencia. Falso fue una elección lógica, no describe un tipo.

over 4 years ago · Santiago Trujillo Denunciar

0

Al leer la Especificación de C#, no se menciona un tipo void . Se describe como un return type . En la tabla de contenido, no se clasifica en tipos de referencia o valor. Se menciona como palabra clave.

La sección sobre la función typeof dice:

La tercera forma de typeof-expression consta de una palabra clave typeof seguida de una palabra clave void entre paréntesis. El resultado de una expresión de esta forma es el objeto System.Type que representa la ausencia de un tipo. El objeto de tipo devuelto por typeof(void) es distinto del objeto de tipo devuelto por cualquier tipo. Este objeto de tipo especial es útil en bibliotecas de clases que permiten la reflexión sobre métodos en el lenguaje, donde esos métodos desean tener una forma de representar el tipo de retorno de cualquier método, incluidos los métodos nulos, con una instancia de System.Type.

Lo que para mí indica que void tiene un tipo asociado, pero solo se usa en el caso de que desee que la reflexión le brinde algo tangible debido al sistema de tipos. De lo contrario void es solo una palabra clave.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda