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).

class

interface

struct (Referencia de C#)

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.

Matrices (Guía de programación de C#)

Indizadores (Guía de programación de C#)

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.

bool

El tipo long: en C#, el tipo long tiene 64 bits, mientras que en C++ tiene 32 bits.

long

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.

struct

class

ref (Referencia de C#)

out (Referencia de C#)

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.

switch

Delegados: los delegados de C# son similares a los punteros a función de C++, son seguros y proporcionan seguridad de tipos.

delegate

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.

base

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.

new

Las directivas de preprocesador se utilizan para la compilación condicional. En C# no se utilizan archivos de encabezado.

Directivas de preprocesador de C#

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.

try-finally

try-catch-finally

Operadores de C#: C# admite operadores adicionales como is y typeof. También presenta una funcionalidad diferente en algunos operadores lógicos.

Operador &

Operador |

Operador ^

is

typeof

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.

using (Directiva, Referencia de C#)

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.

extern

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.

static

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).

unsafe

La sobrecarga de operadores se realiza de forma diferente en C#.

Operadores de 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.

string

String

La palabra clave foreach permite recorrer en iteración las matrices y colecciones.

foreach, in

Globales: en C# no se admiten métodos y variables globales. Los métodos y las variables deben estar contenidos en class o struct.

Estructura general de un programa en C#

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.

static (Referencia de C#)

const (Referencia de C#)

enum (Referencia de C#)

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.

using

Información general sobre metadatos

Las variables locales de C# no se pueden utilizar antes de su inicialización.

Métodos (Guía de programación de C#)

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.

Recolección de elementos no utilizados

Destructores: C# tiene una sintaxis diferente para liberar recursos no administrados de forma determinista.

Destructores

using (Instrucción, Referencia de C#)

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.

Constructores de instancia

Tabla de valores predeterminados

C# no admite campos de bits.

Campos de bits en C++

Los servicios de entrada y salida de C# y el formato los proporciona la biblioteca en tiempo de ejecución de .NET Framework.

Paseo por el lenguaje C#

Tabla de formatos de presentación para valores numéricos

En C#, los parámetros de los métodos no pueden tener valores predeterminados. Utilice sobrecargas de métodos para obtener ese efecto.

Error del compilador CS0241

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.

Elementos genéricos en C#

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.

as (Referencia de C#)

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#).

Vea también

Conceptos

Guía de programación de C#

Administración de elementos en proyectos

Utilizar el Explorador de soluciones