¿Qué es exactamente una construcción de programación de primera clase?
Respuesta simple: es algo que admite todas las operaciones estándar que proporciona el lenguaje.En un lenguaje orientado a objetos, los constructos de primera clase son, como era de esperar, los objetos. Resulta que en tales idiomas a menudo, por razones de eficiencia o legado, ciudadanos de segunda clase, generalmente los tipos de datos primitivos, que no son objetos adecuados, y para los que no se pueden hacer ciertas cosas.
Por ejemplo, en Java un punto es un objeto completo. Se puede declarar un
List<Point> plist;
y luego poner los puntos en ella. Un int no es un objeto completo. Hay ciertas cosas que no puede hacer con una subclase int, por ejemplo, o invocar métodos en ella, aparte de algunos operadores predefinidos. Tampoco se puede almacenar en un
List<int> intlist;
Java tiene una salida para este problema, ya que hay un tipo "caja", Entero, que es un objeto de pleno derecho. Puede declarar un List<Integer>
, por ejemplo. Sin embargo, usar un Entero es mucho menos eficiente que con un "int". Java proporciona boxeo automático y unboxing (es decir, conversión) del tipo Integer a int y viceversa en contextos en los que se requiere uno u otro, para ayudar al programador a combinar lo mejor de ambos mundos.
Tener dos tipos - entero e int - para un número entero es confuso, y algo así como un truco. Se me dice que una versión temprana de Java no tenía primitivos y todos sus tipos eran objetos de pleno derecho. Eso resultó ser demasiado lento para su uso previsto (¡Java temprana resultó ser lenta de todos modos, por supuesto!), Por lo que se agregaron algunas primitivas que no respaldaban la semántica propia del objeto.
en .NET 1.1 no se pudieron pasar los delegados a los métodos porque no eran construcciones de programación de primera clase (he leído algo en este sentido).
No sé nada de .NET, pero parece que usted tiene la idea. Tiene razón: si los delegados no pueden pasar a métodos como cualquier otro objeto estándar, no son construcciones de programación de primera clase.
Gran explicación (y para todos los demás). Ciertamente es una zona gris :) – dotnetdev
¿La respuesta de Jörg no proporciona una definición formal? –
@Rich: Parece que no lo había visto. Editaré cuando tenga oportunidad. –