C# para los desarrolladores de C++
Actualización: noviembre 2007
La tabla siguiente contiene comparaciones importantes entre C# y C++ nativo, que no utilizan /clr. Los programadores de C++ encontrarán rápidamente en esta tabla las diferencias más importantes entre ambos lenguajes.
Nota: |
---|
Los proyectos de C++ y C# provienen de diferentes modelos de proyecto. Para obtener más información acerca de las diferencias entre los proyectos de C++ y C#, vea Administración de elementos en proyectos y Utilizar el Explorador de soluciones. |
Característica |
Consulte el tema |
---|---|
Herencia: en C++, las clases y las estructuras son casi idénticas, mientras que en C# son bastante diferentes. Las clases de C# pueden implementar cualquier número de interfaces, pero sólo pueden heredar de una clase base. Además, las estructuras de C# no admiten la herencia ni los constructores predeterminados explícitos (se proporciona uno de forma predeterminada). |
|
Matrices: en C++, una matriz es simplemente un puntero. En C#, las matrices son objetos que incluyen métodos y propiedades. Por ejemplo, el tamaño de una matriz se puede consultar mediante la propiedad Length. Las matrices de C# también emplean indizadores que comprueban cada uno de los índices utilizados para tener acceso a la matriz. La sintaxis para declarar matrices de C# es diferente de la que se utiliza para las matrices de C++: los símbolos "[]" aparecen después del tipo de matriz en C#, no la variable. |
|
Booleanos: en C++, el tipo bool es esencialmente un entero. En C#, no es posible realizar la conversión del tipo bool a otros tipos o viceversa. |
|
El tipo long: en C#, el tipo long tiene 64 bits, mientras que en C++ tiene 32 bits. |
|
Paso de parámetros: en C++, todas las variables se pasan por valor a menos que se pasen explícitamente con un puntero o una referencia. En C#, las clases se pasan por referencia y las estructuras se pasan por valor, a menos que se pasen explícitamente por referencia con los modificadores de parámetro ref o out. |
|
La instrucción switch: a diferencia de la instrucción switch de C++, C# no admite el paso explícito de una etiqueta case a otra. |
|
Delegados: los delegados de C# son similares a los punteros a función de C++, son seguros y proporcionan seguridad de tipos. |
|
Métodos de clase base: C# admite la palabra clave base para llamar a los miembros de clase base reemplazados desde las clases derivadas. Además, el reemplazo de métodos virtuales o abstractos es explícito en C#, utilizando la palabra clave override. |
Vea también los ejemplos para override |
Ocultación de método: C++ admite la "ocultación" implícita de método mediante la herencia. En C#, debe utilizar el modificador new para ocultar explícitamente un miembro heredado. |
|
Las directivas de preprocesador se utilizan para la compilación condicional. En C# no se utilizan archivos de encabezado. |
|
Control de excepciones: C# proporciona la palabra clave finally para utilizar con el código que debe ejecutarse sin tener en cuenta si se produce una excepción. |
|
Operadores de C#: C# admite operadores adicionales como is y typeof. También presenta una funcionalidad diferente en algunos operadores lógicos. |
|
Palabra clave typedef. En C++, typedef se utiliza para crear nombres más cortos o cómodos para tipos ya declarados. En C#, la directiva using proporciona esta función. |
|
La palabra clave extern: en C++, extern se utiliza para importar tipos. En C#, extern se utiliza para crear alias para el uso de versiones diferentes del mismo ensamblado. |
|
La palabra clave static: en C++, static se puede utilizar tanto para declarar entidades del nivel de clase como para declarar tipos específicos de un módulo. En C#, static sólo se utiliza para declarar entidades del nivel de clase. |
|
El método Main se declara en C# de forma diferente a la función main en C++. En C#, se pone en mayúsculas y siempre es static. Además, la funcionalidad del procesamiento de los argumentos de la línea de comandos es mucho más sólida en C#. |
Main() y argumentos de línea de comandos (Guía de programación de C#) |
C# permite punteros, pero sólo en modo unsafe (no seguro). |
|
La sobrecarga de operadores se realiza de forma diferente en C#. |
|
Cadenas: en C++, una cadena es simplemente una matriz de caracteres. En C#, las cadenas son objetos que admiten métodos sólidos de búsqueda. |
|
La palabra clave foreach permite recorrer en iteración las matrices y colecciones. |
|
Globales: en C# no se admiten métodos y variables globales. Los métodos y las variables deben estar contenidos en class o struct. |
|
La directiva de preprocesamiento #define: en C++, la directiva #define se utiliza generalmente para declarar valores constantes. En C#, la directiva #define no se puede utilizar para este propósito. Las constantes en C# se definen mejor como tipos enumerados (valores integrales sólo) o como miembros estáticos de una clase o estructura. Si tiene varias constantes de este tipo, puede considerar la posibilidad de crear una clase "Constants" independiente donde incluirlas. |
|
Tipos importantes: en C++, los tipos comunes a varios módulos se colocan en archivos de encabezado. En C#, esta información está disponible a través de metadatos. |
|
Las variables locales de C# no se pueden utilizar antes de su inicialización. |
|
Administración de la memoria: C++ no es un lenguaje con recolector de elementos no utilizados; la memoria que no se libera explícitamente permanece asignada hasta que el proceso termina. C# es un lenguaje con recolector de elementos no utilizados. |
|
Destructores: C# tiene una sintaxis diferente para liberar recursos no administrados de forma determinista. |
|
Constructores: de forma similar a lo que ocurre en C++, si no se proporciona un constructor de clase en C#, se genera automáticamente un constructor predeterminado. El constructor predeterminado inicializa todos los campos de la estructura con sus valores predeterminados. |
|
C# no admite campos de bits. |
|
Los servicios de entrada y salida de C# y el formato los proporciona la biblioteca en tiempo de ejecución de .NET Framework. |
|
En C#, los parámetros de los métodos no pueden tener valores predeterminados. Utilice sobrecargas de métodos para obtener ese efecto. |
|
En C#, los métodos y tipos genéricos permiten la parametrización de tipos de manera similar a las plantillas de C++. Sin embargo, existen diferencias significativas. Por ejemplo, en C#, la información de tipo genérico se conserva en tiempo de ejecución. |
|
La palabra clave as es similar a una conversión estándar, salvo que, si se produce un error en la conversión, el valor devuelto es nulo en lugar de producirse una excepción. Esto es similar al uso de static_cast en C++, que, a diferencia de dynamic_cast, no realiza ninguna comprobación en tiempo de ejecución y, por lo tanto, no produce una excepción en caso de error. |
Para obtener más información sobre las comparaciones entre palabras clave en C# y en otros lenguajes de programación, vea Equivalentes del lenguaje. Para obtener información sobre la estructura general de las aplicaciones de C#, vea Estructura general de un programa de C# (Guía de programación de C#).