C # (pronunciado see sostenido , como la nota musical C♯ , pero escrito con el signo numérico ) [b] es un lenguaje de programación multi-paradigma de propósito general que abarca tipado estático, tipado fuerte , ámbito léxico , imperativo , declarativo , funcional , disciplinas de programación genéricas , orientadas a objetos ( basadas en clases ) y orientadas a componentes . [15]
![]() | |
Paradigma | Estructurado , imperativo , orientado a objetos , orientada a eventos , tarea impulsada , funcional , genérico , reflexivo , concurrente |
---|---|
Familia | C |
Diseñada por | Microsoft |
Desarrollador | Microsoft |
Apareció por primera vez | 2000 [1] |
Lanzamiento estable | 9.0 [2] / 10 de noviembre de 2020 |
Disciplina de mecanografía | Estático , dinámico , [3] fuerte , seguro , nominativo , parcialmente inferido |
Plataforma | Infraestructura de lenguaje común |
Licencia | |
Extensiones de nombre de archivo | .cs, .csx |
Sitio web | docs |
Implementaciones importantes | |
Visual C # , .NET Framework , Mono , .NET Core , DotGNU (descontinuado) , Plataforma universal de Windows | |
Dialectos | |
Cω , Spec # , Polyphonic C # , Enhanced C # | |
Influenciado por | |
C ++ , [6] Cω , Eiffel , F # , [a] Haskell , Icon , J # , J ++ , Java , [6] ML , Modula-3 , Object Pascal , [7] Rust , VB | |
Influenciado | |
Capilla , [8] Clojure , [9] Crystal , [10] D , J # , Dart , [11] F # , Hack , Java , [12] [13] Kotlin , Nemerle , Oxygene , Rust , Swift , [14] Vala , TypeScript | |
|
C # fue desarrollado alrededor de 2000 por Microsoft como parte de su iniciativa .NET y luego aprobado como estándar internacional por Ecma (ECMA-334) en 2002 e ISO (ISO / IEC 23270) en 2003. Fue diseñado por Anders Hejlsberg , y su El equipo de desarrollo está actualmente dirigido por Mads Torgersen, siendo uno de los lenguajes de programación diseñados para Common Language Infrastructure (CLI). La versión más reciente es 9.0, que se lanzó en 2020 en .NET 5.0 e incluida en Visual Studio 2019 versión 16.8. [16] [17]
Mono es un proyecto gratuito y de código abierto para desarrollar un compilador multiplataforma y un entorno de ejecución (es decir, una máquina virtual ) para el lenguaje.
Objetivos de diseño
El estándar Ecma enumera estos objetivos de diseño para C #: [15]
- El lenguaje está destinado a ser un lenguaje de programación orientado a objetos simple, moderno, de propósito general .
- El lenguaje y las implementaciones del mismo deben proporcionar soporte para los principios de la ingeniería de software, como la verificación de tipos sólida , la verificación de los límites de la matriz , la detección de intentos de usar variables no inicializadas y la recolección automática de basura . La solidez, la durabilidad y la productividad del programador del software son importantes.
- El lenguaje está diseñado para su uso en el desarrollo de componentes de software adecuados para su implementación en entornos distribuidos.
- La portabilidad es muy importante para el código fuente y los programadores , especialmente aquellos que ya están familiarizados con C y C ++ .
- El apoyo a la internacionalización es muy importante.
- C # está diseñado para ser adecuado para escribir aplicaciones para sistemas alojados y embebidos , desde los muy grandes que usan sistemas operativos sofisticados hasta los muy pequeños que tienen funciones dedicadas.
- Aunque las aplicaciones C # están pensadas para ser económicas con respecto a los requisitos de memoria y potencia de procesamiento , el lenguaje no estaba destinado a competir directamente en rendimiento y tamaño con C o el lenguaje ensamblador.
Historia
Durante el desarrollo de .NET Framework, las bibliotecas de clases se escribieron originalmente utilizando un sistema compilador de código administrado llamado "C simple administrado" (SMC). [18] [19] En enero de 1999, Anders Hejlsberg formó un equipo para construir un nuevo lenguaje en ese momento llamado Cool, que significaba " Lenguaje orientado a objetos similar a C ". [20] Microsoft había considerado mantener el nombre "Cool" como el nombre final del idioma, pero decidió no hacerlo por razones de marca registrada. Para cuando el proyecto .NET se anunció públicamente en la Conferencia de desarrolladores profesionales de julio de 2000 , el lenguaje había cambiado de nombre a C # y las bibliotecas de clases y el tiempo de ejecución de ASP.NET se habían adaptado a C #.
Hejlsberg es el diseñador principal y arquitecto principal de C # en Microsoft, y anteriormente estuvo involucrado en el diseño de Turbo Pascal , Embarcadero Delphi (anteriormente CodeGear Delphi, Inprise Delphi y Borland Delphi) y Visual J ++ . En entrevistas y artículos técnicos, ha declarado que las fallas [21] en la mayoría de los principales lenguajes de programación (por ejemplo, C ++ , Java , Delphi y Smalltalk ) impulsaron los fundamentos del Common Language Runtime (CLR), que, a su vez, impulsó el diseño de el propio lenguaje C #.
James Gosling , quien creó el lenguaje de programación Java en 1994, y Bill Joy , cofundador de Sun Microsystems , el creador de Java, llamaron a C # una "imitación" de Java; Gosling dijo además que "[C # es] una especie de Java con confiabilidad, productividad y seguridad eliminada". [22] [23] Klaus Kreft y Angelika Langer (autores de un libro de secuencias de C ++) declararon en una publicación de blog que "Java y C # son lenguajes de programación casi idénticos. Repetición aburrida que carece de innovación", [24] "Casi nadie afirmará que Java o C # son lenguajes de programación revolucionarios que cambiaron la forma en que escribimos programas ", y" C # tomó prestado mucho de Java, y viceversa. Ahora que C # admite el boxeo y el unboxing, tendremos una característica muy similar en Java ". [25] En julio de 2000, Hejlsberg dijo que C # "no es un clon de Java" y está "mucho más cerca de C ++" en su diseño. [26]
Desde el lanzamiento de C # 2.0 en noviembre de 2005, los lenguajes C # y Java han evolucionado en trayectorias cada vez más divergentes, convirtiéndose en dos lenguajes bastante diferentes. Una de las primeras salidas importantes se produjo con la adición de genéricos a ambos lenguajes, con implementaciones muy diferentes. C # hace uso de la reificación para proporcionar objetos genéricos de "primera clase" que se pueden usar como cualquier otra clase, con la generación de código realizada en el momento de la carga de la clase. [27] Además, C # ha agregado varias características importantes para acomodar la programación de estilo funcional, culminando con las extensiones LINQ lanzadas con C # 3.0 y su marco de soporte de expresiones lambda , métodos de extensión y tipos anónimos . [28] Estas características permiten a los programadores de C # utilizar técnicas de programación funcional, como cierres , cuando es ventajoso para su aplicación. Las extensiones LINQ y las importaciones funcionales ayudan a los desarrolladores a reducir la cantidad de código repetitivo que se incluye en tareas comunes como consultar una base de datos, analizar un archivo xml o buscar en una estructura de datos, cambiando el énfasis a la lógica del programa real para ayudar a mejorar la legibilidad. y mantenibilidad. [29]
C # solía tener una mascota llamada Andy (que lleva el nombre de Anders Hejlsberg). Fue retirado el 29 de enero de 2004. [30]
C # se presentó originalmente al subcomité ISO JTC 1 / SC 22 para su revisión, [31] según ISO / IEC 23270: 2003, [32] fue retirado y luego fue aprobado según ISO / IEC 23270: 2006. [33] El 23270: 2006 se retira bajo 23270: 2018 y se aprueba con esta versión. [34]
Nombre
Microsoft utilizó por primera vez el nombre C # en 1988 para una variante del lenguaje C diseñada para la compilación incremental. [35] Ese proyecto no se completó, pero el nombre sigue vivo.

El nombre "Do sostenido" se inspiró en la notación musical mediante la cual un símbolo agudo indica que la nota escrita debe tener un tono un semitono más alto . [36] Esto es similar al nombre de lenguaje de C ++ , donde "++" indica que una variable debe incrementarse en 1 después de ser evaluada. El símbolo agudo también se asemeja a una ligadura de cuatro símbolos "+" (en una cuadrícula de dos por dos), lo que implica además que el lenguaje es un incremento de C ++. [37]
Debido a limitaciones técnicas de visualización (fuentes estándar, navegadores, etc.) y al hecho de que el símbolo nítido ( U + 266F ♯ MUSIC SHARP SIGN (HTML ♯
· &sharp
)) no está presente en la mayoría de los diseños de teclado , el signo de número ( Se eligió U + 0023 # SIGNO NUMÉRICO (HTML #
· &num
)) para aproximar el símbolo agudo en el nombre escrito del lenguaje de programación. [38] Esta convención se refleja en la Especificación del lenguaje C # ECMA-334. [15]
El sufijo "sharp" ha sido utilizado por varios otros lenguajes .NET que son variantes de los lenguajes existentes, incluido J # (un lenguaje .NET también diseñado por Microsoft que se deriva de Java 1.1), A # (de Ada ) y el lenguaje de programación funcional F # . [39] La implementación original de Eiffel para .NET se llamó Eiffel #, [40] un nombre retirado ya que ahora se admite el lenguaje Eiffel completo . El sufijo también se ha utilizado para bibliotecas , como Gtk # (un contenedor .NET para GTK y otras bibliotecas de GNOME ) y Cocoa # (un contenedor para Cocoa ).
Versiones
Versión | Especificación de idioma | Fecha | .NETO | Estudio visual | ||
---|---|---|---|---|---|---|
Ecma | ISO / IEC | Microsoft | ||||
C # 1.0 | Diciembre de 2002 | Abril de 2003 | Enero de 2002 | Enero de 2002 | .NET Framework 1.0 | Visual Studio .NET 2002 |
C # 1.1 C # 1.2 | Octubre de 2003 | Abril de 2003 | .NET Framework 1.1 | Visual Studio .NET 2003 | ||
C # 2.0 [41] | Junio de 2006 | Septiembre de 2006 | Septiembre de 2005 [c] | Noviembre de 2005 | .NET Framework 2.0 .NET Framework 3.0 | Visual Studio 2005 Visual Studio 2008 |
C # 3.0 [42] | Ninguno | Agosto de 2007 | Noviembre de 2007 | .NET Framework 2.0 (excepto LINQ) [43] .NET Framework 3.0 (excepto LINQ) [43] | Visual Studio 2008 | |
C # 4.0 [44] | Abril de 2010 | Abril de 2010 | .NET Framework 4 | Visual Studio 2010 | ||
C # 5.0 [45] | Diciembre de 2017 | Diciembre de 2018 | Junio del 2013 | Agosto 2012 | .NET Framework 4.5 | Visual Studio 2012 Visual Studio 2013 |
C # 6.0 [46] | Ninguno | Sequía | Julio de 2015 | .NET Framework 4.6 .NET Core 1.0 .NET Core 1.1 | Visual Studio 2015 | |
C # 7.0 [47] [48] | Propuesta de especificación | Marzo de 2017 | .NET Framework 4.7 | Visual Studio 2017, versión 15.0 | ||
C # 7.1 [49] | Propuesta de especificación | Agosto de 2017 | .NET Core 2.0 | Visual Studio 2017, versión 15.3 [50] | ||
C # 7.2 [51] | Propuesta de especificación | Noviembre de 2017 | Visual Studio 2017, versión 15.5 [52] | |||
C # 7.3 [53] | Propuesta de especificación | Mayo de 2018 | .NET Core 2.1 .NET Core 2.2 .NET Framework 4.8 | Visual Studio 2017, versión 15.7 [52] | ||
C # 8.0 [54] | Propuesta de especificación | Septiembre de 2019 | .NET Core 3.0 .NET Core 3.1 | Visual Studio 2019 versión 16.3 [55] | ||
C # 9.0 [56] | Propuesta de especificación | Septiembre de 2020 | .NET 5.0 | Visual Studio 2019 versión 16.8 [55] |
Sintaxis
La sintaxis central del lenguaje C # es similar a la de otros lenguajes de estilo C como C, C ++ y Java, particularmente:
- Los puntos y comas se utilizan para indicar el final de una declaración.
- Los corchetes se utilizan para agrupar declaraciones. Las declaraciones se agrupan comúnmente en métodos (funciones), los métodos en clases y las clases en espacios de nombres .
- Las variables se asignan con un signo igual , pero se comparan con dos signos iguales consecutivos .
- Los corchetes se utilizan con matrices , tanto para declararlas como para obtener un valor en un índice dado en una de ellas.
Características distintivas
Algunas características notables de C # que lo distinguen de C, C ++ y Java, donde se indica, son:
Portabilidad
Por diseño, C # es el lenguaje de programación que refleja de forma más directa la Common Language Infrastructure (CLI) subyacente . [57] La mayoría de sus tipos intrínsecos corresponden a tipos de valor implementados por el marco CLI. Sin embargo, la especificación del lenguaje no establece los requisitos de generación de código del compilador: es decir, no establece que un compilador de C # debe apuntar a Common Language Runtime, o generar Common Intermediate Language (CIL), o generar cualquier otro formato específico. En teoría, un compilador de C # podría generar código de máquina como los compiladores tradicionales de C ++ o Fortran .
Mecanografía
C # admite declaraciones de variables implícitas fuertemente tipadas con la palabra clave var
y matrices tipadas implícitamente con la palabra clave new[]
seguida de un inicializador de colección.
C # soporta una estricta tipo de datos Boolean , bool
. Las declaraciones que toman condiciones, como while
y if
, requieren una expresión de un tipo que implemente el true
operador, como el tipo booleano. Si bien C ++ también tiene un tipo booleano, se puede convertir libremente hacia y desde enteros, y expresiones como if (a)
require solo que a
sea convertible a bool, lo a
que permite ser un int o un puntero. C # no permite este enfoque de "entero que significa verdadero o falso", con el argumento de que obligar a los programadores a usar expresiones que devuelvan exactamente bool
puede evitar ciertos tipos de errores de programación como if (a = b)
(uso de asignación en =
lugar de igualdad ==
).
C # es más seguro para los tipos que C ++. Las únicas conversiones implícitas por defecto son aquellas que se consideran seguras, como el ensanchamiento de números enteros. Esto se aplica en tiempo de compilación, durante JIT y, en algunos casos, en tiempo de ejecución. No se producen conversiones implícitas entre booleanos y enteros, ni entre miembros de enumeración y enteros (excepto para el literal 0, que se puede convertir implícitamente a cualquier tipo enumerado). Cualquier conversión definida por el usuario debe marcarse explícitamente como explícita o implícita, a diferencia de los constructores de copia y los operadores de conversión de C ++ , que son implícitos de forma predeterminada.
C # tiene soporte explícito para covarianza y contravarianza en tipos genéricos, a diferencia de C ++ que tiene cierto grado de soporte para contravarianza simplemente a través de la semántica de tipos de retorno en métodos virtuales.
Los miembros de la enumeración se colocan en su propio ámbito .
El lenguaje C # no permite variables o funciones globales. Todos los métodos y miembros deben declararse dentro de las clases. Los miembros estáticos de clases públicas pueden sustituir variables y funciones globales.
Las variables locales no pueden sombrear las variables del bloque adjunto, a diferencia de C y C ++.
Metaprogramación
La metaprogramación se puede lograr de varias formas:
- Reflexión usando la API de marco
- La característica del lenguaje del árbol de expresión representa el código en una estructura de datos en forma de árbol, donde cada nodo es un árbol de sintaxis abstracto que se puede inspeccionar o ejecutar. Esto permite la modificación dinámica del código ejecutable.
- La característica del lenguaje de atributos son metadatos adjuntos a un campo o bloque de código como ensamblajes , miembros y tipos , y son equivalentes a las anotaciones en Java . Los atributos son accesibles tanto para el compilador como programáticamente a través de la reflexión . Muchos de estos atributos duplican la funcionalidad de las directivas de preprocesador dependientes de la plataforma de GCC y VisualC ++.
- Los generadores de código fuente , característica del compilador Roslyn C # , permiten la metaprogramación de tiempo de compilación. Durante el proceso de compilación, los desarrolladores pueden inspeccionar el código que se está compilando (usando la API del compilador) y generar nuevos archivos fuente de C # que se pueden agregar a la compilación.
Métodos y funciones
Un método en C # es un miembro de una clase que se puede invocar como una función (una secuencia de instrucciones), en lugar de la mera capacidad de retención de valor de una propiedad de clase. Como en otros lenguajes sintácticamente similares, como C ++ y ANSI C , la firma de un método es una declaración que comprende en orden: cualquier palabra clave de accesibilidad opcional (como private
), la especificación explícita de su tipo de retorno (como int
, o la palabra clave void
si no se devuelve ningún valor), el nombre del método y, finalmente, una secuencia entre paréntesis de especificaciones de parámetros separadas por comas, cada una de las cuales consta del tipo de parámetro, su nombre formal y, opcionalmente, un valor predeterminado que se utilizará siempre que no se proporcione ninguno. Ciertos tipos específicos de métodos, como los que simplemente obtienen o establecen una propiedad de clase por valor de retorno o asignación, no requieren una firma completa, pero en el caso general, la definición de una clase incluye la declaración de firma completa de sus métodos.
Al igual que C ++, y a diferencia de Java, los programadores de C # deben usar la palabra clave del modificador de alcance virtual
para permitir que las subclases invaliden los métodos. [58]
Los métodos de extensión en C # permiten a los programadores usar métodos estáticos como si fueran métodos de la tabla de métodos de una clase, lo que permite a los programadores agregar métodos a un objeto que creen que debería existir en ese objeto y sus derivados.
El tipo dynamic
permite el enlace de métodos en tiempo de ejecución, lo que permite llamadas a métodos similares a JavaScript y composición de objetos en tiempo de ejecución .
C # tiene soporte para punteros de función fuertemente tipados a través de la palabra clave delegate
. Al igual que la señal y la ranura pseudo-C ++ del marco Qt , C # tiene una semántica que rodea específicamente a los eventos de estilo de publicación-suscripción, aunque C # usa delegados para hacerlo.
C # ofrece synchronized
llamadas a métodos similares a Java , a través del atributo [MethodImpl(MethodImplOptions.Synchronized)]
, y tiene soporte para bloqueos mutuamente excluyentes a través de la palabra clave lock
.
Propiedad
C # admite clases con propiedades . Las propiedades pueden ser funciones simples de acceso con un campo de respaldo, o implementar funciones getter y setter.
Desde C # 3.0, el azúcar sintáctico de las propiedades implementadas automáticamente está disponible, [59] donde el descriptor de acceso (captador) y el mutador (definidor) encapsulan operaciones en un solo atributo de una clase.
Espacio de nombres
AC # namespace
proporciona el mismo nivel de aislamiento de código que Java package
o C ++ namespace
, con reglas y características muy similares a las de un package
. Los espacios de nombres se pueden importar con la sintaxis "using". [60]
Acceso a la memoria
En C #, los punteros de dirección de memoria solo se pueden usar dentro de bloques marcados específicamente como inseguros , y los programas con código inseguro necesitan los permisos adecuados para ejecutarse. La mayor parte del acceso a objetos se realiza a través de referencias de objetos seguras, que siempre apuntan a un objeto "activo" o tienen un valor nulo bien definido ; es imposible obtener una referencia a un objeto "muerto" (uno que ha sido recolectado como basura), oa un bloque de memoria aleatorio. Un puntero inseguro puede apuntar a una instancia de un tipo de valor 'no administrado' que no contiene ninguna referencia a objetos recolectados de basura, matriz, cadena o un bloque de memoria asignada en la pila. El código que no está marcado como inseguro aún puede almacenar y manipular punteros a través del System.IntPtr
tipo, pero no puede desreferenciarlos.
La memoria administrada no se puede liberar explícitamente; en su lugar, se recolecta automáticamente como basura. La recolección de basura aborda el problema de las pérdidas de memoria liberando al programador de la responsabilidad de liberar memoria que ya no es necesaria en la mayoría de los casos. El código que retiene las referencias a los objetos por más tiempo de lo necesario puede experimentar un uso de memoria mayor de lo necesario, sin embargo, una vez que se libera la referencia final a un objeto, la memoria está disponible para la recolección de basura.
Excepción
Los programadores tienen a su disposición una variedad de excepciones estándar. Los métodos en las bibliotecas estándar arrojan regularmente excepciones del sistema en algunas circunstancias y el rango de excepciones arrojadas normalmente está documentado. Se pueden definir clases de excepción personalizadas para las clases, lo que permite implementar un manejo específico para circunstancias particulares según sea necesario. [61]
Las excepciones marcadas no están presentes en C # (a diferencia de Java). Esta ha sido una decisión consciente basada en los problemas de escalabilidad y versión. [62]
Polimorfismo
A diferencia de C ++ , C # no admite herencia múltiple , aunque una clase puede implementar cualquier número de " interfaces " (clases completamente abstractas). Esta fue una decisión de diseño del arquitecto principal del lenguaje para evitar complicaciones y simplificar los requisitos arquitectónicos en toda la CLI.
Al implementar múltiples interfaces que contienen un método con el mismo nombre y tomar parámetros del mismo tipo en el mismo orden (es decir, la misma firma ), similar a Java , C # permite que un único método cubra todas las interfaces y, si es necesario, métodos específicos para cada interfaz.
Sin embargo, a diferencia de Java, C # admite la sobrecarga de operadores . Solo los operadores sobrecargados con más frecuencia en C ++ pueden estar sobrecargados en C #.
Consulta integrada de lenguaje (LINQ)
C # tiene la capacidad de utilizar LINQ a través de .NET Framework. Un desarrollador puede consultar una variedad de fuentes de datos, siempre que la IEnumerable
interfaz esté implementada en el objeto. Esto incluye documentos XML, un conjunto de datos ADO.NET y bases de datos SQL. [63]
El uso de LINQ en C # ofrece ventajas como compatibilidad con Intellisense , sólidas capacidades de filtrado, seguridad de tipos con capacidad de verificación de errores de compilación y coherencia para consultar datos en una variedad de fuentes. [64] Hay varias estructuras de lenguaje diferentes que se pueden utilizar con C # y LINQ y son expresiones de consulta, expresiones lambda, tipos anónimos, variables tipadas implícitamente, métodos de extensión e inicializadores de objetos. [sesenta y cinco]
Programación funcional
Aunque principalmente era un lenguaje imperativo, C # 2.0 ofrecía soporte limitado para la programación funcional a través de funciones de primera clase y cierres en forma de delegados anónimos. C # 3.0 soporte ampliado para programación funcional con la introducción de una sintaxis ligera para expresiones lambda, métodos de extensión (una posibilidad para módulos) y una sintaxis de comprensión de listas en forma de un lenguaje de "comprensión de consultas". C # 7.0 agrega características que normalmente se encuentran en lenguajes funcionales como tuplas y coincidencia de patrones. [66]
Sistema de tipo común
C # tiene un sistema de tipos unificado . Este sistema de tipo unificado se denomina Sistema de tipo común (CTS). [67]
Un sistema de tipos unificado implica que todos los tipos, incluidas las primitivas como los enteros, son subclases de la clase. Por ejemplo, cada tipo hereda un método.System.Object
ToString()
Categorías de tipos de datos
CTS separa los tipos de datos en dos categorías: [67]
- Tipos de referencia
- Tipos de valor
Las instancias de tipos de valor no tienen identidad referencial ni semántica de comparación referencial. Las comparaciones de igualdad y desigualdad para tipos de valor comparan los valores de datos reales dentro de las instancias, a menos que los operadores correspondientes estén sobrecargados. Los tipos de valor se derivan de , siempre tienen un valor predeterminado y siempre se pueden crear y copiar. Algunas otras limitaciones de los tipos de valor son que no pueden derivarse entre sí (pero pueden implementar interfaces) y no pueden tener un constructor predeterminado explícito (sin parámetros). Ejemplos de tipos de valor son todos los tipos primitivos, como (un entero de 32 bits con signo), (un número de punto flotante IEEE de 32 bits), (una unidad de código Unicode de 16 bits) e (identifica un punto específico en el tiempo con precisión de nanosegundos). Otros ejemplos son (enumeraciones) y (estructuras definidas por el usuario).System.ValueType
int
float
char
System.DateTime
enum
struct
En contraste, los tipos de referencia tienen la noción de identidad referencial, lo que significa que cada instancia de un tipo de referencia es inherentemente distinta de cualquier otra instancia, incluso si los datos dentro de ambas instancias son los mismos. Esto se refleja en las comparaciones predeterminadas de igualdad y desigualdad para los tipos de referencia, que prueban la igualdad referencial en lugar de la estructural, a menos que los operadores correspondientes estén sobrecargados (como en el caso de ). Algunas operaciones no siempre son posibles, como crear una instancia de un tipo de referencia, copiar una instancia existente o realizar una comparación de valores en dos instancias existentes. Aunque los tipos de referencia específicos pueden proporcionar tales servicios al exponer un constructor público o implementar una interfaz correspondiente (como o ). Ejemplos de tipos de referencia son (la última clase base para todas las demás clases de C #), (una cadena de caracteres Unicode) y (una clase base para todas las matrices de C #).System.String
ICloneable
IComparable
object
System.String
System.Array
Ambas categorías de tipos son extensibles con tipos definidos por el usuario.
Boxeo y unboxing
El boxeo es la operación de convertir un objeto de tipo valor en un valor de un tipo de referencia correspondiente. [67] El boxeo en C # está implícito.
Unboxing es la operación de convertir un valor de un tipo de referencia (previamente encuadrado) en un valor de un tipo de valor. [67] El desempaquetado en C # requiere una conversión de tipo explícita . Un objeto en caja de tipo T solo se puede desempaquetar a una T (o una T que acepta valores NULL). [68]
Ejemplo:
int foo = 42 ; // Tipo de valor. barra de objeto = foo ; // foo está encajado en la barra. int foo2 = ( int ) bar ; // Desempaquetado de nuevo al tipo de valor.
Bibliotecas
La especificación C # detalla un conjunto mínimo de tipos y bibliotecas de clases que el compilador espera tener disponibles. En la práctica, C # se usa con mayor frecuencia con alguna implementación de Common Language Infrastructure (CLI), que está estandarizada como ECMA-335 Common Language Infrastructure (CLI) .
Además de las especificaciones estándar de la CLI, existen muchas bibliotecas comerciales y de clases comunitarias que se basan en las bibliotecas del marco .NET para proporcionar funcionalidad adicional. [69]
C # puede realizar llamadas a cualquier biblioteca incluida en la Lista de bibliotecas y marcos de .NET .
Ejemplos de
Hola Mundo
El siguiente es un programa C # muy simple, una versión del ejemplo clásico " Hola mundo ":
usando el sistema ;Consola . WriteLine ( "¡Hola, mundo!" );
El uso de declaraciones de nivel superior de C # 9 presenta la lógica del punto de entrada de un programa que se puede escribir sin declarar un tipo explícito o método Main. Hasta que C # 8 sigue siendo la forma clásica:
usando el sistema ;// Una versión de la clase de programa clásica "Hello World" Program { static void Main ( string [] args ) { Console . WriteLine ( "¡Hola, mundo!" ); } }
Este código mostrará este texto en la ventana de la consola:
¡Hola Mundo!
Cada línea tiene un propósito:
usando el sistema ;
La línea anterior importa todos los tipos en el System
espacio de nombres. Por ejemplo, la Console
clase que se usa más adelante en el código fuente se define en el System
espacio de nombres, lo que significa que se puede usar sin proporcionar el nombre completo del tipo (que incluye el espacio de nombres).
// Una versión del programa clásico "Hello World"
Esta línea es un comentario; describe y documenta el código para los programadores.
programa de clase
Arriba hay una definición de clase para la Program
clase. Todo lo que sigue entre el par de llaves describe esa clase.
{ ... }
Las llaves delimitan los límites de un bloque de código. En esta primera instancia, están marcando el inicio y el final de la Program
clase.
static void Main ( cadena [] argumentos )
Esto declara el método del miembro de la clase donde el programa comienza a ejecutarse. El tiempo de ejecución de .NET llama al Main
método. A diferencia de Java , el Main
método no necesita la public
palabra clave, que le dice al compilador que cualquier clase puede llamar al método desde cualquier lugar. Escribir es equivalente a escribir . La palabra clave estática hace que el método sea accesible sin una instancia de . El punto de entrada de cada aplicación de consola debe declararse; de lo contrario, el programa requeriría una instancia de , pero cualquier instancia requeriría un programa. Para evitar esa dependencia circular irresoluble , los compiladores de C # que procesan aplicaciones de consola (como la anterior) informan de un error si no hay un método. La palabra clave declara que no tiene valor de retorno .static void Main(string[] args)
private static void Main(string[] args)
Program
Main
static
Program
static Main
void
Main
Consola . WriteLine ( "¡Hola, mundo!" );
Esta línea escribe la salida. Console
es una clase estática en el System
espacio de nombres. Proporciona una interfaz para los flujos estándar de entrada, salida y error para aplicaciones de consola. El programa llama al Console
método WriteLine
, que muestra en la consola una línea con el argumento, la cadena "Hello, world!"
.
GUI
Un ejemplo de GUI :
usando el sistema ; usando System.Windows.Forms ;class Programa { static void Main () { MessageBox . Show ( "¡Hola, mundo!" ); Consola . WriteLine ( "¡Es casi el mismo argumento!" ); } }
Este ejemplo es similar al ejemplo anterior, excepto que genera un cuadro de diálogo que contiene el mensaje "¡Hola, mundo!" en lugar de escribirlo en la consola.
Imagenes
Otra biblioteca útil es la System.Drawing
biblioteca, que se utiliza para dibujar imágenes mediante programación. Por ejemplo:
usando el sistema ; usando System.Drawing ; Ejemplo de clase pública { imagen estática pública img ; static void Main () { img = Imagen . FromFile ( "Image.png" ); } }
Esto creará una imagen idéntica a la almacenada en "Image.png".
Estandarización y concesión de licencias
En agosto de 2001, Microsoft Corporation, Hewlett-Packard e Intel Corporation copatrocinaron la presentación de especificaciones para C # y Common Language Infrastructure (CLI) a la organización de estándares Ecma International . En diciembre de 2001, ECMA lanzó ECMA-334 C # Language Specification . C # se convirtió en un estándar ISO en 2003 (ISO / IEC 23270: 2003 - Tecnología de la información - Lenguajes de programación - C # ). ECMA había adoptado previamente especificaciones equivalentes a la segunda edición de C #, en diciembre de 2002.
En junio de 2005, ECMA aprobó la edición 3 de la especificación C # y actualizó ECMA-334. Las adiciones incluyeron clases parciales, métodos anónimos, tipos que aceptan valores NULL y genéricos (algo similar a las plantillas de C ++ ).
En julio de 2005, ECMA presentó a ISO / IEC JTC 1, a través del proceso Fast-Track de este último, los estándares y TR relacionados. Este proceso suele tardar entre 6 y 9 meses.
La definición del lenguaje C # y la CLI están estandarizadas bajo los estándares ISO y Ecma que brindan una protección de licencia razonable y no discriminatoria contra las reclamaciones de patentes.
Microsoft acordó no demandar a los desarrolladores de código abierto por violar patentes en proyectos sin fines de lucro por la parte del marco que está cubierta por el OSP. [70] Microsoft también ha acordado no hacer cumplir las patentes relacionadas con los productos de Novell contra los clientes de pago de Novell [71] con la excepción de una lista de productos que no mencionan explícitamente C #, .NET o la implementación de Novell de .NET ( The Mono Project ) . [72] Sin embargo, Novell sostiene que Mono no infringe ninguna patente de Microsoft. [73] Microsoft también ha hecho un acuerdo específico para no hacer cumplir los derechos de patente relacionados con el complemento del navegador Moonlight , que depende de Mono, siempre que se obtenga a través de Novell . [74]
Implementaciones
Microsoft lidera el desarrollo de los compiladores y el conjunto de herramientas de referencia de código abierto de C #, el primer compilador que Roslyn compila en lenguaje intermedio (IL), el segundo RyuJIT, [75] es un compilador JIT (just-in-time), que es dinámico y realiza una optimización sobre la marcha y compila el IL en código nativo para el front-end de la CPU. [76] RyuJIT es de código abierto y está escrito en C ++. [77] Roslyn está completamente escrito en código administrado (C #), se ha abierto y la funcionalidad ha aparecido como API. Por lo tanto, permite a los desarrolladores crear herramientas de diagnóstico y refactorización. [4] [78] Dos ramas de la implementación oficial son .NET (código cerrado, Windows 10 solo desde .NET 4.6.2) y .NET Core (código abierto, multiplataforma); .NET y .NET Core convergieron en una implementación de código abierto .NET 5.0. [79] En .NET 4.6, un nuevo compilador JIT reemplazó al anterior. [80] [81]
Otros compiladores de C # (algunos de los cuales incluyen una implementación de Common Language Infrastructure y bibliotecas de clases .NET):
- El proyecto Mono proporciona un compilador C # de código abierto, una implementación completa de código abierto de Common Language Infrastructure que incluye las bibliotecas de marco requeridas tal como aparecen en la especificación ECMA, y una implementación casi completa de las bibliotecas de clase .NET propietarias de Microsoft hasta .NET 3.5. A partir de Mono 2.6, no existen planes para implementar WPF ; WF está previsto para una versión posterior; y solo hay implementaciones parciales de LINQ to SQL y WCF . [82]
- La cadena de herramientas Elements de RemObjects incluye RemObjects C #, que compila C # para .NET, Java, Cocoa, Android, Windows, Linux y WebAssembly. * El proyecto DotGNU (ahora descontinuado) también proporcionó un compilador C # de código abierto, una implementación casi completa de Common Language Infrastructure, incluidas las bibliotecas de marco requeridas tal como aparecen en la especificación ECMA, y el subconjunto de algunas de las bibliotecas de clase .NET propietarias restantes de Microsoft hasta .NET 2.0 (las que no están documentadas o incluidas en la especificación ECMA, pero incluidas en Distribución estándar de .NET Framework de Microsoft).
- Xamarin proporciona herramientas para desarrollar aplicaciones multiplataforma para sistemas operativos de escritorio y móviles comunes, utilizando C # como base de código y compilando en código nativo.
Mono es una opción común para los motores de juegos debido a su naturaleza multiplataforma [ cita requerida ] . El motor de juego de Unity usa Mono C # como su lenguaje de programación principal. El motor del juego Godot ha implementado un módulo Mono C # opcional gracias a una donación de $ 24,000 de Microsoft. [83]
Ver también
|
|
Notas
- ^ para async
- ^ Por convención,se utilizaun signo de número para el segundo carácter en texto normal; en las representaciones artísticas, a vecesse utilizaun verdadero signo nítido : C♯. Sin embargo, elestándar ECMA 334 establece: "El nombre C # se escribe con la LETRA C MAYÚSCULA LATINA C (U + 0043) seguida del SIGNO DE NÚMERO # (U + 0023)".
- ^ El documento de especificación de Microsoft C # 2.0 solo contiene las nuevas características 2.0. Para funciones más antiguas, utilice la especificación 1.2 anterior.
Referencias
- ^ "InfoQ eMag: una vista previa de C # 7" .
- ^ "Anuncio de .NET 5.0" .
- ^ Torgersen, Mads (27 de octubre de 2008). "Nuevas funciones en C # 4.0" . Microsoft . Consultado el 28 de octubre de 2008 .
- ^ a b "El compilador Roslyn .NET proporciona lenguajes C # y Visual Basic con API de análisis de código enriquecido: dotnet / roslyn" . 13 de noviembre de 2019 - a través de GitHub.
- ^ "CoreCLR es el tiempo de ejecución de .NET Core. Incluye el recolector de basura, el compilador JIT, tipos de datos primitivos y clases de bajo nivel .: dotnet / coreclr" . 13 de noviembre de 2019 - a través de GitHub.
- ^ a b Naugler, David (mayo de 2007). "Programador C # 2.0 para C ++ y Java: taller de conferencias". Revista de Ciencias de la Computación en las Universidades . 22 (5).
Aunque C # ha sido fuertemente influenciado por Java, también ha sido fuertemente influenciado por C ++ y es mejor visto como un descendiente tanto de C ++ como de Java.
- ^ Hamilton, Naomi (1 de octubre de 2008). "La AZ de los lenguajes de programación: C #" . Computerworld . Consultado el 12 de febrero de 2010 .
Todos estamos sobre los hombros de gigantes aquí y cada lenguaje se basa en lo que sucedió antes, por lo que le debemos mucho a C, C ++, Java, Delphi, todas estas otras cosas que vinieron antes que nosotros. ( Anders Hejlsberg )
- ^ "Especificaciones de la capilla (Agradecimientos)" (PDF) . Cray Inc. 1 de octubre de 2015 . Consultado el 14 de enero de 2016 .
- ^ "Preguntas y respuestas de Rich Hickey por Michael Fogus" . Archivado desde el original el 11 de enero de 2017 . Consultado el 11 de enero de 2017 .
- ^ Borenszweig, Ary. "¡Lanzamiento de Crystal 0.18.0!" .
Está muy inspirado en Ruby y otros lenguajes (como C #, Go y Python).
- ^ "Lenguajes web y máquinas virtuales: Fast Code siempre está de moda. (V8, Dart) - Google I / O 2013" . Consultado el 22 de diciembre de 2013 .
- ^ Java 5.0 agregó varias características de lenguaje nuevas (las mejoradas para bucle , autoboxing , varargs y anotaciones ), después de que se introdujeran en el lenguaje C # similar (y competidor) [1] [2]
- ^ Cornelius, Barry (1 de diciembre de 2005). "Java 5 se pone al día con C #" . Servicios de Computación de la Universidad de Oxford . Consultado el 18 de junio de 2014 .
En mi opinión, es C # el que ha provocado estos cambios radicales en el lenguaje Java. ( Barry Cornelius )
- ^ Lattner, Chris (3 de junio de 2014). "Página de inicio de Chris Lattner" . Chris Lattner . Consultado el 12 de mayo de 2020 .
El lenguaje Swift es el producto del esfuerzo incansable de un equipo de expertos en lenguaje, gurús de la documentación, ninjas de optimización de compiladores y un grupo interno de prueba interna increíblemente importante que brindó comentarios para ayudar a refinar y probar ideas. Por supuesto, también se benefició enormemente de las experiencias ganadas con esfuerzo por muchos otros lenguajes en el campo, extrayendo ideas de Objective-C, Rust, Haskell, Ruby, Python, C #, CLU y demasiados otros para enumerarlos.
- ^ a b c Especificación del lenguaje C # (PDF) (4ª ed.). Ecma International . Junio de 2006 . Consultado el 26 de enero de 2012 .
- ^ "Notas de la versión preliminar de Visual Studio 2019" . docs.microsoft.com . Consultado el 15 de octubre de 2020 .
- ^ "Descarga .NET 5.0 (Linux, macOS y Windows)" . Microsoft . Consultado el 15 de octubre de 2020 .
- ^ Zander, Jason (22 de noviembre de 2007). "Par de hechos históricos" . Consultado el 23 de febrero de 2009 .
- ^ Guthrie, Scott (28 de noviembre de 2006). "¿En qué idioma se escribió originalmente ASP.Net?" . Archivado desde el original el 24 de junio de 2016 . Consultado el 21 de febrero de 2008 .
- ^ Hamilton, Naomi (1 de octubre de 2008). "La AZ de los lenguajes de programación: C #" . Computerworld . Consultado el 1 de octubre de 2008 .
- ^ "Detalles" . nilsnaegele.com . Consultado el 7 de abril de 2019 .
- ^ Wylie Wong (2002). "Por qué C # de Microsoft no lo es" . CNET: CBS Interactive . Consultado el 28 de mayo de 2014 .
- ^ Bill Joy (7 de febrero de 2002). "El punto ciego de Microsoft" . cnet.com . Consultado el 12 de enero de 2010 .
- ^ Klaus Kreft y Angelika Langer (2003). "Después de Java y C #, ¿qué sigue?" . Consultado el 18 de junio de 2013 .
- ^ Klaus Kreft y Angelika Langer (3 de julio de 2003). "Después de Java y C #, ¿qué sigue?" . artima.com . Consultado el 12 de enero de 2010 .
- ^ Osborn, John (1 de agosto de 2000). "Deep Inside C #: una entrevista con el arquitecto jefe de Microsoft, Anders Hejlsberg" . O'Reilly Media . Consultado el 14 de noviembre de 2009 . Cite journal requiere
|journal=
( ayuda ) - ^ "Genéricos (Guía de programación de C #)" . Microsoft . Consultado el 21 de marzo de 2011 .
- ^ Don Box y Anders Hejlsberg (febrero de 2007). "LINQ: .NET Language-Integrated Query" . Microsoft . Consultado el 21 de marzo de 2011 .
- ^ Mercer, Ian (15 de abril de 2010). "Por qué la programación funcional y LINQ es a menudo mejor que el código de procedimiento" . abodit.com . Consultado el 21 de marzo de 2011 .
- ^ "Andy se retira" . Blog de Dan Fernandez . Blogs.msdn.com. 29 de enero de 2004. Archivado desde el original el 19 de enero de 2016 . Consultado el 4 de octubre de 2012 .
- ^ "Comités técnicos - JTC 1 / SC 22 - Lenguajes de programación, sus entornos e interfaces de software del sistema" . ISO . Consultado el 4 de octubre de 2012 .
- ^ "ISO / IEC 23270: 2003 - Tecnología de la información - Especificación del lenguaje C #" . Iso.org. 23 de agosto de 2006. Archivado desde el original el 8 de mayo de 2012 . Consultado el 4 de octubre de 2012 .
- ^ "ISO / IEC 23270: 2006 - Tecnología de la información - Lenguajes de programación - C #" . Iso.org. 26 de enero de 2012 . Consultado el 4 de octubre de 2012 .
- ^ "SO / IEC 23270: 2018 Tecnología de la información - Lenguajes de programación - C #" . ISO . Consultado el 26 de noviembre de 2020 .
- ^ Mariani, Rico. "Mi historia de Visual Studio (Parte 1) - Tidbits de rendimiento de Rico Mariani" . Tidbits de rendimiento de Rico Mariani .
- ^ Kovacs, James (7 de septiembre de 2007). "Lección de Historia de C # / .NET" . Consultado el 18 de junio de 2009 .
- ^ Hejlsberg, Anders (1 de octubre de 2008). "La AZ de los lenguajes de programación: C #" . Computerworld .
- ^ "Preguntas frecuentes de Microsoft C #" . Microsoft . Archivado desde el original el 14 de febrero de 2006 . Consultado el 25 de marzo de 2008 .
- ^ "Preguntas frecuentes de F #" . Investigación de Microsoft. Archivado desde el original el 18 de febrero de 2009 . Consultado el 18 de junio de 2009 .
- ^ Simón, Rafael; Stapf, Emmanuel; Meyer, Bertrand (junio de 2002). "Full Eiffel en .NET Framework" . Microsoft . Consultado el 18 de junio de 2009 .
- ^ "Novedades del compilador y lenguaje C # 2.0" . Microsoft. Archivado desde el original el 18 de diciembre de 2010 . Consultado el 11 de junio de 2014 .
- ^ Hejlsberg, Anders; Torgersen, Mads. "Descripción general de C # 3.0" . Red de desarrolladores de Microsoft . Microsoft . Consultado el 11 de junio de 2014 .
- ^ a b "Usando C # 3.0 desde .NET 2.0" . Danielmoth.com. 13 de mayo de 2007 . Consultado el 4 de octubre de 2012 .
- ^ Hejlsberg, Anders. "Direcciones futuras para C # y Visual Basic" . Arquitecto jefe de C # . Microsoft . Consultado el 21 de septiembre de 2011 .
- ^ "Introducción a las nuevas funciones de C # 5.0" . Blogs de MSDN . Microsoft . Consultado el 11 de junio de 2014 .
- ^ "Estado de implementación de la característica de idioma" . github . Microsoft . Consultado el 13 de febrero de 2015 .
- ^ "Novedades de C # 7" . Microsoft Docs . 21 de diciembre de 2016.
- ^ "Nuevas funciones en C # 7.0" . Blog de .NET . Consultado el 9 de junio de 2017 .
- ^ "Novedades de C # 7.1" . Microsoft Docs . Consultado el 9 de octubre de 2017 .
- ^ "Notas de la versión de Visual Studio 2017 15.3" . docs.microsoft.com .
- ^ "Novedades de C # 7.2" . Microsoft Docs . Consultado el 26 de noviembre de 2017 .
- ^ a b "Notas de la versión de Visual Studio 2017 15.9" . docs.microsoft.com .
- ^ "Novedades de C # 7.3" . Microsoft Docs . Consultado el 23 de junio de 2018 .
- ^ "Novedades de C # 8.0" . Microsoft Docs .
- ^ a b "Notas de la versión de Visual Studio 2019 16.8" . docs.microsoft.com .
- ^ BillWagner. "Novedades de C # 9.0 - Guía de C #" . docs.microsoft.com . Consultado el 15 de octubre de 2020 .
- ^ Visual Studio 2010 y .NET 4 Six-in-One . Prensa Wrox. 2010. ISBN 978-0470499481.
- ^ "virtual (Referencia de C #)" . docs.microsoft.com .
- ^ "Propiedades implementadas automáticamente (Guía de programación de C #)" . Consultado el 12 de septiembre de 2020 .
- ^ "directiva de uso - Referencia de C #" . Microsoft Docs . Consultado el 14 de abril de 2019 .
- ^ "Cómo crear excepciones definidas por el usuario" . Consultado el 12 de septiembre de 2020 .
- ^ Venners, Bill; Eckel, Bruce (18 de agosto de 2003). "El problema con las excepciones marcadas" . Consultado el 30 de marzo de 2010 .
- ^ Zhang, Xue Dong; Teng, Zi Mu; Zhao, Dong Wang (septiembre de 2014). "Investigación de la tecnología de acceso a bases de datos Under.NET Framework". Mecánica Aplicada y Materiales . 644–650: 3077–3080. doi : 10.4028 / www.scientific.net / AMM.644-650.3077 . S2CID 62201466 . ProQuest 1565579768 .
- ^ Otey, Michael (febrero de 2006). "LINQ to the Future". Revista de SQL Server . Vol. 8 no. 2. págs. 17-21. ProQuest 214859896 .
- ^ Sheldon, William (noviembre de 2010). "Nuevas funciones en LINQ". Revista de SQL Server . Vol. 12 no. 11. págs. 37–40. ProQuest 770609095 .
- ^ "Novedades de C # 7.0" . Microsoft Docs . Consultado el 14 de abril de 2019 .
- ^ a b c d Archer, Tom (2001). "Parte 2, Capítulo 4: El sistema de tipos". Dentro de C # . Redmond, Washington: Microsoft Press. ISBN 0-7356-1288-9.
- ^ Lippert, Eric (19 de marzo de 2009). "Representación e identidad" . Aventuras fabulosas en la codificación . Blogs.msdn.com . Consultado el 4 de octubre de 2012 .
- ^ "Bibliotecas marco" . docs.microsoft.com .
- ^ "Compromiso de patente para desarrolladores de código abierto" .
- ^ "Acuerdo de cooperación de patentes - Colaboración de interoperabilidad de Microsoft y Novell" . Microsoft . 2 de noviembre de 2006. Archivado desde el original el 17 de mayo de 2009 . Consultado el 5 de julio de 2009 .
Microsoft, en nombre de sí mismo y de sus Subsidiarias (colectivamente "Microsoft"), por la presente se compromete a no demandar a los Clientes de Novell y a los Clientes de las Subsidiarias de Novell por infracción de las Patentes Cubiertas de Microsoft debido al uso por parte del Cliente de copias específicas de un Producto Cubierto como distribuido por Novell o sus Subsidiarias (colectivamente "Novell") por el cual Novell ha recibido Ingresos (directa o indirectamente) por dichas copias específicas; siempre que el convenio anterior se limite al uso por parte de dicho Cliente (i) de las copias específicas autorizadas por Novell en consideración de dichos Ingresos, y (ii) dentro del alcance autorizado por Novell en consideración de dichos Ingresos.
- ^ "Definiciones" . Microsoft . 2 de noviembre de 2006 . Consultado el 5 de julio de 2009 .
- ^ Steinman, Justin (7 de noviembre de 2006). "Novell responde a las preguntas de la comunidad" . Consultado el 5 de julio de 2009 .
Sostenemos que Mono no infringe ninguna patente de Microsoft.
- ^ "Pacto con los destinatarios posteriores de Moonlight - Colaboración de interoperabilidad de Microsoft y Novell" . Microsoft . 28 de septiembre de 2007. Archivado desde el original el 23 de septiembre de 2010 . Consultado el 8 de marzo de 2008 .
"Destinatario intermedio" hace referencia a una entidad o individuo que utiliza para el propósito previsto una Implementación Moonlight obtenida directamente de Novell oa través de un Destinatario intermedio ... Microsoft se reserva el derecho de actualizar (incluso descontinuar) el convenio anterior ... "Implementación Moonlight" significa solo aquellas partes específicas de Moonlight 1.0 o Moonlight 1.1 que se ejecutan solo como un complemento para un navegador en una computadora personal y no tienen licencia GPLv3 o una licencia similar.
- ^ https://devblogs.microsoft.com/dotnet/the-ryujit-transition-is-complete/
- ^ https://docs.microsoft.com/en-us/dotnet/standard/managed-execution-process
- ^ https://github.com/dotnet/coreclr/tree/master/src/jit
- ^ "Guía de C #" . docs.microsoft.com .
- ^ https://dotnet.microsoft.com/download/dotnet/5.0
- ^ https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/mitigation-new-64-bit-jit-compiler
- ^ https://devblogs.microsoft.com/dotnet/the-ryujit-transition-is-complete/
- ^ "Compatibilidad - Mono" . Mono-project.com. 19 de diciembre de 2011 . Consultado el 4 de octubre de 2012 .
- ^ Etcheverry, Ignacio (21 de octubre de 2017). "Introduciendo C # en Godot" . Motor Godot . Archivado desde el original el 26 de octubre de 2018 . Consultado el 26 de octubre de 2018 .
Otras lecturas
- Drayton, Peter; Albahari, Ben; Neward, Ted (2002). Referencia de bolsillo del lenguaje C # . O'Reilly. ISBN 0-596-00429-X.
- Petzold, Charles (2002). Programación de Microsoft Windows con C # . Microsoft Press. ISBN 0-7356-1370-2.
enlaces externos
- Especificación del lenguaje C #
- Guía de programación de C #
- Especificación del lenguaje ISO C #
- Código fuente de la plataforma del compilador C # ("Roslyn")