2012-01-14 17 views
12

Esta es una pregunta muy general. Soy un "programador" autodidacta que programa en C#. Un proyecto en el que me gustaría trabajar sería mucho más fácil (en el gran esquema de cosas) si supiera C++. ¿Qué tan fácil es pasar de C# a C++? ¿Alguna dificultad de la que debería estar pendiente? Y si estoy usando VS2010, ¿puedo programar (no en la misma clase, pero el mismo proyecto) algo en C# y C++?Pasar de C# a C++ (además de trabajar con ambos en la misma solución)

+14

Es más fácil [tirarse al pie en C++] (http://m5p.com/~pravn/foot.html) y le hará mucho más daño que en C#. –

+7

@UweKeim Esto es hilarante, ¡me reí muy bien! ¡Gracias! – formatc

+2

@keynesiancross Lamento decir que tiene algunos días ** realmente ** difíciles por delante ahahahahaah – Chani

Respuesta

21

Pasar de C# a C++ no es fácil. La sintaxis básica puede aparecer igual (por ejemplo, si, para ...), pero existen diferencias profundas, p. Ej. el patrón RAII y las variables de semántica de pila cuyos destructores se invocan cuando salen del alcance, etc. no están presentes en C#.

Además, C# utiliza un recolector de basura no determinista (que puede estar bien para recursos de memoria, pero es inútil para otro tipo de recursos). En cambio, con C++ moderno, puede usar plantillas y punteros inteligentes (como std ::/boost :: * shared_ptr *), que le permiten tener determinista "recolección de basura" contada por referencia, que es muy eficiente, y es válido tanto para recursos de memoria como para recursos que no son de memoria (como manejadores de archivos, conectores, texturas ...).

Por otra parte, los C# genéricos son muy diferentes de las plantillas de C++ (C++ plantillas son muy de gran alcance, y permiten un nivel avanzado de programación llamado plantilla de meta-programación).

En VS2010 puede tener una solución para alojar proyectos C++ y C#. Para comunicarse entre los dos mundos (el mundo nativo de C++ y el mundo administrado de .NET/C#) puede usar C++/CLI como una especie de capa de puente.

En Windows 8 debe introducirse una nueva tecnología, llamada WinRT (basada en COM), que permite la comunicación entre idiomas. En este caso, puede usar C++ con WRL (una biblioteca basada en plantillas) o extensiones de lenguaje C++/CX para compilar componentes de C++ que se pueden usar desde C# y .NET.

Happy learning.

+1

Gracias por su sólida respuesta. Ahora bien, no tengo idea de qué son las tres primeras cosas de las que hablas ... (RAII/stack sematics ??, recolector de basura no determinista ?? y plantillas ??) – keynesiancross

+1

Si mencionas 'shared_ptr', deberías al menos también mencionar los problemas obvios con él en comparación con un GC (ciclos, subprocesamiento múltiple, rendimiento) de lo contrario, que podría conducir a sorpresas interesantes para los desconocedores. Nota menor: ref contando eficiente? No en realidad no. – Voo

+0

@Voo: el conteo de ref es ciertamente más eficiente que tener un recolector de basura funcionando como un hilo de fondo y en algún punto en el tiempo congelar todo lo que marca la memoria y barrerlo. Además, creo que .NET GC se ejecuta bajo presión de memoria, pero no tiene ninguna pista sobre otros recursos (como conectores, o memoria de textura en tarjetas gráficas, etc.). En cambio, con los destructores de C++ y shared_ptr, todos los recursos (no solo la memoria del sistema) se liberan tan pronto como nadie los haga referencia. –

5

puedo programar (no en la misma clase, pero el mismo proyecto) algo tanto en C# y C++?

La respuesta es no, no se puede. Puede si usa Managed C++ & C++. Pero si se está trabajando con C# y luego no se puede tener C# y el código C++ dentro de un mismo proyecto

¿Es fácil pasar de C# para C++? `

que es un poco subjetivo, pero en mi opinión, será un paso muy difícil. C++ es un idioma diferente, así que será tan difícil como aprender un nuevo idioma :) otra vez es subjetivo, así que no entraré en detalles

5

Dado que está trabajando con .NET, supongo que está utilizando Visual Studio?

Es bastante fácil combinar C# y C++ en el mismo programa, utilizando la opción del compilador /clr. Su código de C++ puede incluir tanto clases de C++ normales, que cumplen con el estándar, como objetos de .NET ref class diseñados para usar desde C#. Los dos están separados pero se pueden acceder entre sí, a través de punteros desde ref class hasta el nativo class, y la plantilla gcroot desde el class nativo al ref class.

Tenga en cuenta que he dicho "en el mismo programa ", no "en el mismo proyecto ". Tendrá que dividirse en dos partes, un proyecto de C# y un proyecto de C++/CLI, y uno será un archivo DLL que el otro cargará. También hay un truco para combinar los dos durante la compilación, por lo que terminas con un solo archivo ejecutable, pero eso es más problemas de lo que suele valer.


Nota, es posible encontrar esta clase puntero inteligente escribí útil, que hace que el uso de class objetos nativos de ref class .NET objetos mucho más fácil.

9

Vine a la inversa de C++ a C#. En muchos sentidos, eso fue un alivio. C++ tiene muchas más reglas que C# particularmente en cuanto a la asignación de memoria. La sintaxis también puede ser desafiante y es fácil perderse en la memoria fuera de límites. Sin embargo, C++ es mucho más adecuado para la programación a nivel del sistema, pero con gran potencia implica una gran responsabilidad.

Recomiendo primero agarrar una copia de Effective C++ de Scott Meyer y leerla de principio a fin. Este es el mejor recurso que conozco para obtener los conceptos básicos correctos y sin duda mejorar la calidad del código que estaba produciendo, incluso como un desarrollador de C++ "con experiencia". A continuación, tome un marco de prueba unitario y eche un vistazo a c++ kata (en este caso, un proyecto xcode pero aún así debería ser útil). Y familiarícese con el Standard Template Library que contiene un montón de códigos/clases útiles/eficientes para contenedores, algoritmos, etc.

Por último, la mejor de las suertes. Aprender un nuevo idioma es siempre un desafío y puede ser desalentador, pero la recompensa generalmente vale la pena. Si nada más, verás tu código C# con nuevos ojos.

Cuestiones relacionadas