Publicado el 19 de Mayo del 2018
1.551 visualizaciones desde el 19 de Mayo del 2018
318,9 KB
50 paginas
Creado hace 21a (13/12/2002)
A
C# para programadores C++
Introducción
Este apéndice está destinado a aquellos programadores que están muy familiarizados con C++ y desean ver
cuáles son las diferencias entre C++ y C#. Repasaremos el lenguaje C#, destacando específicamente aquellas
áreas en las que C# se diferencia de C++. Dado que ambos lenguajes comparten una gran cantidad de sintaxis
y metodología, los programadores de C++ pueden utilizar este apéndice como una vía rápida para el
aprendizaje de C#.
Debe quedar claro desde el principio que C# es un lenguaje diferente a C++. Mientras que C++ fue diseñado
para la programación orientada a objetos de propósito general en los días en que el ordenador típico era una
máquina independiente que ejecutaba una interfaz de usuario basada en línea de comandos, C# ha sido
diseñado específicamente para trabajar en la Plataforma .NET, y está orientado al entorno moderno de
Windows y a las interfaces de usuario controladas mediante ratón, las redes e Internet. Sin embargo, es
innegable que ambos lenguajes son muy similares tanto en su sintaxis como en que ambos han sido diseñados
para facilitar el mismo paradigma de programación, en el que el código se estructura alrededor de jerarquías de
clases heredadas. Esta similitud no es sorprendente dado que, como hemos destacado a lo largo de este libro,
C# ha sido en gran medida diseñado como un lenguaje orientado a objetos que mantiene las bondades de los
lenguajes orientados a objetos anteriores a él, de los cuales C++ es probablemente el ejemplo más exitoso
hasta el presente, a la vez que aprende de sus errores de diseño.
Debido a las similitudes entre los dos lenguajes, los desarrolladores que dominan C++ pueden encontrar que la
vía más rápida de aprender C# es tratarlo como si fuera C++ con unas pocas diferencias y aprender cuáles son
esas diferencias. Este apéndice está diseñado para facilitar esa tarea. Comenzaremos por una presentación
general que menciona cuáles son las diferencias principales entre los dos lenguajes a la vez que indica cuáles
son los elementos que comparten en común. A continuación, mostraremos la apariencia del clásico programa
'Hello, World' en cada uno de los dos lenguajes. Por último, el grueso de este apéndice se dedica a un análisis
punto por punto que ofrece una comparación detallada entre C# y C++ en cada una de las áreas principales de
los lenguajes. Inevitablemente, un apéndice de este tamaño no puede ser exhaustivo, sino que ha sido diseñado
para cubrir las diferencias fundamentales entre los lenguajes que Ud. encontrará en la programación diaria.
Debemos notar, en todo caso, que C# depende fuertemente del soporte que le ofrece la librería de clases base
Apéndice A
.NET en diversas áreas. En este apéndice limitaremos nuestra atención al lenguaje C# en sí, y no cubriremos
extensamente las clases base.
Para la comparación, tomaremos ANSI C++ como punto de referencia. Microsoft ha añadido numerosas
extensiones a C++, y el compilador de Visual C++ presenta unas pocas incompatibilidades con el estándar
ANSI que señalaremos ocasionalmente; pero normalmente no haremos mención de ellas al comparar los dos
lenguajes.
Convenios utilizados en este apéndice
En este apéndice adoptaremos un convenio adicional para mostrar el código. El código C# siempre se muestra
del mismo modo que en el resto del libro, con sombreado en gris:
// este es código C#
class MyClass : MyBaseClass
{
Si deseamos resaltar cualquier código C# nuevo o importante, lo mostraremos en negrita:
// este es código C#
class MyClass : MyBaseClass // ya hemos visto esto
{
int X; // esto es interesante
El código C++ que se muestra para la comparación se presenta así:
// esto es código C++
class CMyClass : public CMyBaseClass
{
En el código de los ejemplos de este apéndice también hemos tenido en cuenta los convenios de nombres más
comunes para los dos lenguajes bajo Windows. Por esa razón, los nombres de clases en los ejemplos C++
comienzan con 'C', mientras que los ejemplos correspondientes de C# no. Asimismo, la notación húngara se
utiliza frecuentemente para los nombres de variables únicamente en los ejemplos C++.
Terminología
Ud. deberá tener en cuenta que en algunas construcciones del lenguaje se utiliza diferente terminología en C#
con relación a C++. Las variables miembros de C++ se conocen en C# como campos, mientras que las
funciones miembros de C++ se conocen como métodos en C#. En C#, el término función tiene un significado
más general, y se refiere a cualquier miembro de una clase que contiene código. Ello significa que el término
función cubre los métodos, propiedades, constructores, destructores, indizadores y sobrecargas de operadores.
En C++, los términos 'función' y 'método' se utilizan en la conversación de forma intercambiable, aunque
estrictamente hablando un método de C++ es una función miembro virtual.
Si le surge alguna confusión al respecto, la siguiente tabla deberá serle útil:
Significado
Variable que es miembro de una clase
Cualquier miembro de una clase que
contiene código
Cualquier miembro de una clase que
contiene código y que puede ser
1118
Término C++
Variable miembro
Función (o función
miembro)
Función (o función
Término C#
Campo
Función
Método
C# para programadores C++
llamado por su nombre con la sintaxis
HacerAlgo(/*parámetros*/).
Función virtual que se define como
miembro de una clase
miembro)
Método
Método virtual
Ud. también debe tener en cuenta las diferencias entre otro par de términos:
Término C++
Instrucción compuesta
valor-l1
Término C#
Instrucción de bloque
expresión-variable
En este apéndice utilizaremos siempre que sea posible la terminología asociada al lenguaje sobre el que
estemos hablando.
Una comparación entre C# y C++
En esta sección resumiremos brevemente las diferencias y similitudes generales entre ambos lenguajes.
Diferencias
Las principales áreas en las que difieren C# y C++ son las siguientes:
Destino de la compilación – El código C++ normalmente se compila a lenguaje ensamblador. Por
el contrario, C# se compila a un lenguaje intermedio (IL), que presenta alguna similitud con los
códigos de bytes de Java. El lenguaje intermedio es convertido a continuación en código de máquina
ejecutable mediante un proceso de compilación JIT. El código intermedio que se emite es
almacenado en un fichero o conjunto de ficheros conocido como unidad de ensamblaje
(assembly). Una unidad de ensamblaje conforma esencialmente la unidad en la que se empaqueta el
IL, correspondiendo a una DLL o fichero ejecutable que sería creado por un compilador de C++.
Gestión de memoria – C# ha sido diseñado para liberar al programador de las tareas relacionadas
con la gestión de la memoria. Ello significa que en C# no es necesario liberar explícitamente la
memoria que ha sido solicitada dinámicamente, como se haría en C++. En lugar de eso, un
recolector de basura recupera periódicamente la memoria que deja de ser necesaria. Con vistas a
facilitar este proceso, C# impone ciertas restricciones a cómo Ud. puede utilizar las variables que se
almacenan en memoria dinámica, y es más estricto en la verificación de los tipos que C++.
Punteros – Los punteros pueden utilizarse en C# del mismo modo que en C++, pero únicamente
dentro de bloques de código que hayan sido específicamente marcados para ello. La mayor parte del
tiempo C# se apoya en referencias al estilo de Java o VB para las instancias de clases, y el lenguaje
ha sido diseñado de forma tal que los punteros no son necesarios con tanta frecuencia como lo son
en C++.
Sobrecarga de operadores – C# no permite la sobrecarga explícita de tantos operadores como C++.
Esto se debe fundamentalmente a que el compilador de C# automatiza esta tarea hasta cierto punto
utilizando cualquier sobrecarga definida para operadores elementales (como =) para resolver
automáticamente la sobrecarga de operadores combinados (+=).
1 La 'l' viene de 'left' (izquierda). Un valor-l (l-value en inglés) es una expresión que produce una
referencia a memoria, y por tanto puede situarse en el lado izquierdo de una instrucción de
asignación (N. del T.)
1119
❑
❑
❑
❑
Apéndice A
Librerías – Tanto C++ como C# se apoyan en la existencia de una librería bastante amplia. En el
caso de ANSI C++, estamos hablando de la librería estándar. C# se apoya en un conjunto de clases
conocidas como las clases base .NET. Las clases base .NET están basadas en la herencia simple,
mientras que la librería estándar de C++ se apoya en una mezcla de herencia y plantillas. Además,
mientras que ANSI C++ mantiene la librería separada del lenguaje en sí, la interdependencia en C#
es mucho mayor, y la implementación de muchas palabras reservadas de C# depende directamente
de clases base particulares.
Plataformas de destino – C# ha sido diseñado explícitamente para satisfacer las necesidades de
programación en entornos dotados de interfaz gráfica de usuario (GUI) – no necesariamente
Windows, aunque el lenguaje está disponible actualmente sólo para Windows, así como para el
desarrollo de servicios de segundo plano, tales como servicios web. Esto realmente no afecta al
lenguaje en sí, pero se refleja en el diseño de la librería de clases. Por el contrario, C++ fue
diseñado para un uso más general en los días cuando las interfaces de usuario basadas en línea de
comandos eran predominantes. Ni C++ ni la librería estándar incluyen ningún tipo de soporte para
elementos de interfaz gráfica. En Windows, los programadores de C++ han tenido que apoyarse
directa o indirectamente en el API de Windows para obtener ese soporte.
Directivas para el preprocesador – C# incluye algunas directivas para el prepro
Comentarios de: C# para programadores C++ (0)
No hay comentarios