Articulo de referencia

C# (lenguaje de programación)

{{Cite web | url=https://www.infoq.com/minibooks/emag-c-sharp-preview | title=InfoQ eMag: A Preview of C# 7 | access-date=November 11, 2016 | archive-date=April 24, 2023 | archi...

C# ( / ˌ s ˈ ʃ ɑːr p / véase SHARP ) [ b ] es un lenguaje de programación de alto nivel de propósito general que admite múltiples paradigmas . C# abarca las disciplinas de programación de tipado estático , [ 17 ] : 4 tipado fuerte , ámbito léxico , imperativo , declarativo , funcional , genérico , [ 17 ] : 22 orientado a objetos ( basado en clases ) y orientado a componentes . [ 1 ]

Los principales diseñadores del lenguaje de programación C# fueron Anders Hejlsberg , Scott Wiltamuth y Peter Golde de Microsoft . [ 1 ] Se distribuyó ampliamente por primera vez en julio de 2000 [ 1 ] y posteriormente fue aprobado como estándar internacional por Ecma (ECMA-334) en 2002 e ISO / IEC (ISO/IEC 23270 y 20619 [ c ] ) en 2003. Microsoft presentó C# junto con .NET Framework y Microsoft Visual Studio , ambos, técnicamente hablando, de código cerrado . En ese momento, Microsoft no tenía productos de código abierto. Cuatro años después, en 2004, comenzó un proyecto gratuito y de código abierto llamado Mono , que proporcionaba un compilador multiplataforma y un entorno de ejecución para el lenguaje de programación C#. Una década después, Microsoft lanzó Visual Studio Code (editor de código), Roslyn (compilador) y la plataforma unificada .NET (marco de desarrollo de software), todas compatibles con C#, gratuitas, de código abierto y multiplataforma. Mono también se unió a Microsoft, pero no se integró en .NET.

A partir de noviembre de 2025 ,La versión estable más reciente del lenguaje es C# 14. [ 18 ] [ 19 ] [ 20 ]

Objetivos de diseño

El estándar Ecma enumera estos objetivos de diseño para C#: [ 1 ]

Historia

Antiguos logotipos de C#

Durante el desarrollo de .NET Framework , las bibliotecas de clases se escribieron originalmente utilizando un sistema de compilación de código administrado llamado Simple Managed C (SMC). [ 23 ] [ 24 ] En enero de 1999, Anders Hejlsberg formó un equipo para crear un nuevo lenguaje en ese momento llamado COOL, que significaba " Lenguaje orientado a objetos similar a C ". [ 25 ]

Microsoft consideró la posibilidad de conservar el nombre "COOL (C-like Object Oriented Language)" como nombre definitivo del lenguaje, pero optó por no hacerlo por motivos de marca registrada. Para cuando el proyecto .NET se anunció públicamente en la Conferencia de Desarrolladores Profesionales de julio de 2000 , el lenguaje ya se había renombrado como C#, y las bibliotecas de clases y el entorno de ejecución de ASP.NET se habían adaptado a C#.

Hejlsberg fue el diseñador principal y arquitecto jefe de C# en Microsoft, y anteriormente había participado 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, afirmó que las deficiencias de la mayoría de los lenguajes de programación importantes (por ejemplo, C++ , Java , Delphi y Smalltalk ) impulsaron los fundamentos del Common Language Runtime (CLR), que, a su vez, impulsó el diseño del lenguaje C#. [ 26 ]

James Gosling , creador del lenguaje de programación Java en 1994, y Bill Joy , cofundador de Sun Microsystems , la empresa creadora de Java, calificaron a C# como una "imitación" de Java; Gosling añadió: "[C# es] una especie de Java sin fiabilidad, productividad ni seguridad". [ 27 ] [ 28 ]

En julio de 2000, Hejlsberg dijo que C# "no es un clon de Java" y que está "mucho más cerca de C++" en su diseño. [ 29 ]

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 grandes diferencias se produjo con la incorporación de genéricos a ambos lenguajes, con implementaciones muy distintas. C# utiliza la reificación para proporcionar objetos genéricos de "primera clase" que pueden usarse como cualquier otra clase, con la generación de código realizada en el momento de la carga de la clase. [ 30 ]

C# también ha añadido varias características importantes para adaptarse a la programación funcional, culminando en 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 . [ 31 ] Estas características permiten a los programadores de C# utilizar técnicas de programación funcional, como los cierres , cuando resulta ventajoso para su aplicación. Las extensiones LINQ y las importaciones funcionales ayudan a los desarrolladores a reducir la cantidad de código repetitivo incluido en tareas comunes como consultar una base de datos, analizar un archivo XML o buscar en una estructura de datos, desplazando el énfasis hacia la lógica real del programa para ayudar a mejorar la legibilidad y el mantenimiento. [ 32 ]

C# solía tener una mascota llamada Andy (en honor a Anders Hejlsberg ). Fue retirada el 29 de enero de 2004. [ 33 ]

C# se presentó originalmente al subcomité SC 22 del JTC 1 de ISO/IEC para su revisión, [ 34 ] bajo ISO/IEC 23270:2003, [ 35 ] se retiró y luego se aprobó bajo ISO/IEC 23270:2006. [ 36 ] La 23270:2006 se retira bajo 23270:2018 y se aprueba con esta versión. [ 37 ]

Nombre

Microsoft utilizó por primera vez el nombre C# en 1988 para una variante del lenguaje C diseñada para la compilación incremental. [ 38 ] Ese proyecto no se completó y el nombre se reutilizó posteriormente.

El nombre "C sharp" se inspiró en la notación musical donde el símbolo "shape" indica que la nota escrita debe elevarse un semitono . [ 39 ] Esto es similar al nombre del lenguaje C++ , donde "++" indica que una variable debe incrementarse en 1 después de ser evaluada. El símbolo "shape" también se asemeja a una ligadura de cuatro símbolos "+" (en una cuadrícula de dos por dos), lo que implica aún más que el lenguaje es una evolución de C++. [ 40 ]

Debido a las limitaciones técnicas de visualización (fuentes estándar, navegadores, etc.) y a que la mayoría de las distribuciones de teclado carecen de un símbolo de sostenido ( U+266F MUSIC SHARP SIGN ( & sharp; ) ), se eligió el signo de número ( U+0023 # NUMBER SIGN ( & num; ) ) para aproximar el símbolo de sostenido en el nombre escrito del lenguaje de programación. [ 41 ] Esta convención se refleja en la especificación del lenguaje C# ECMA-334. [ 1 ]

El sufijo "sharp" ha sido utilizado por varios otros lenguajes compatibles/que cumplen con Microsoft .NET que son variantes de lenguajes existentes, incluidos 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# . [ 42 ] La implementación original de Eiffel para .NET se llamaba Eiffel# , [ 43 ] un nombre retirado ya que ahora se admite el lenguaje Eiffel completo . El sufijo también se ha utilizado para bibliotecas , como Gtk# (un envoltorio .NET para GTK y otras bibliotecas GNOME ) y Cocoa# (un envoltorio para Cocoa ).

Versiones

El desarrollo del texto para los estándares (a partir de C#  6) se realiza en GitHub . C#  7 se presentó a Ecma y se aprobó en diciembre de 2023. A partir de enero de 2024, el estándar para C#  8 se encuentra actualmente en desarrollo, tomando como referencia las propuestas de lenguaje aprobadas .

Sintaxis

La sintaxis básica del lenguaje C# es similar a la de otros lenguajes de estilo C, como C, Objective-C, C++ y Java, en particular:

  • Los puntos y comas se utilizan para indicar el final de una oración.
  • Las llaves se utilizan para agrupar instrucciones. Las instrucciones se agrupan comúnmente en métodos (funciones), los métodos en clases y las clases en espacios de nombres .
  • Las variables se asignan usando un signo de igual , pero se comparan usando dos signos de igual consecutivos .
  • Los corchetes se utilizan con matrices , tanto para declararlas como para obtener un valor en un índice determinado dentro de una de ellas.
  • "class", "int" y "void" se utilizan para definir funciones de programas a gran escala (normalmente la función principal) en los scripts, la mayoría de las veces en lenguajes de programación de estilo C.

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 más directamente la Infraestructura de Lenguaje Común  (CLI) subyacente. [ 73 ] La mayoría de sus tipos intrínsecos corresponden a tipos de valor implementados por el marco de trabajo CLI. Sin embargo, la especificación del lenguaje no establece los requisitos de generación de código del compilador: es decir, no indica que un compilador de C# deba apuntar a un Entorno de Ejecución de Lenguaje Común (CLR), ni generar Lenguaje Intermedio Común (CIL), ni generar ningún otro formato específico. Algunos compiladores de C# también pueden generar código máquina como los compiladores tradicionales de Objective-C, C, C++, Ensamblador y Fortran . [ 74 ] [ 75 ]

Mecanografía

C# admite declaraciones de variables fuertemente tipadas implícitamente con la palabra clave var, [ 17 ] : 470 y matrices tipadas implícitamente con la palabra clave new[]seguida de un inicializador de colección. [ 17 ] : 80 [ 21 ] : 58

Su sistema de tipos se divide en dos familias: tipos de valor, como los tipos numéricos integrados y las estructuras definidas por el usuario, que se pasan automáticamente como copias cuando se usan como parámetros, y tipos de referencia, que incluyen arreglos, instancias de clases y cadenas, que solo pasan un puntero al objeto correspondiente. Debido a su manejo especial del operador de igualdad y su inmutabilidad , las cadenas se comportarán, a efectos prácticos, como si fueran valores. El programador incluso puede usarlas como etiquetas de caso . Cuando sea necesario, los tipos de valor se empaquetarán automáticamente. [ 76 ]

C# admite un tipo de datos booleano estricto , bool. Las sentencias que toman condiciones, como whiley if, requieren una expresión de un tipo que se evalúe al truevalor booleano. Si bien C++ también tiene un tipo booleano, se puede convertir libremente a y desde enteros, y expresiones como if (a)solo requieren que asea convertible a bool, lo que permite aque sea 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 boolpuede prevenir ciertos tipos de errores de programación como if (a = b)(uso de asignación =en lugar de igualdad ==).

C# es más seguro en cuanto a tipos que C++. Las únicas conversiones implícitas por defecto son aquellas que se consideran seguras, como la ampliación de enteros. Esto se aplica en tiempo de compilación, durante la compilación Just-in-Time 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 el literal 0, que puede convertirse 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 por defecto.

C# tiene soporte explícito para covarianza y contravarianza en tipos genéricos, [ 17 ] : 144 [ 21 ] : 23 a diferencia de C++ que tiene cierto grado de soporte para contravarianza simplemente a través de la semántica de los 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 ni funciones globales. Todos los métodos y miembros deben declararse dentro de las clases. Los miembros estáticos de las clases públicas pueden sustituir a las variables y funciones globales.

A diferencia de C y C++, las variables locales no pueden ocultar variables del bloque que las contiene, pero sí pueden ocultar nombres a nivel de tipo.

Metaprogramación

La metaprogramación se puede lograr de varias maneras:

  • La reflexión es compatible a través de las API de .NET, que permiten escenarios como la inspección de metadatos de tipo y la invocación dinámica de métodos.
  • Los árboles de expresiones [ 77 ] representan el código como un árbol de sintaxis abstracta , donde cada nodo es una expresión que puede ser inspeccionada o ejecutada. Esto permite la modificación dinámica del código ejecutable en tiempo de ejecución. Los árboles de expresiones introducen cierta homoiconicidad en el lenguaje.
  • En la jerga de C#, los atributos son metadatos que se pueden adjuntar a tipos, miembros o ensamblados completos , equivalentes a las anotaciones en Java . Los atributos son accesibles tanto para el compilador como para el código mediante reflexión, lo que les permite ajustar su comportamiento. [ 78 ] Muchos de los atributos nativos duplican la funcionalidad de las directivas de preprocesador dependientes de la plataforma de GCC y VisualC++.
  • System.Reflection.Emitespacio de nombres, [ 79 ] que contiene clases que emiten metadatos y CIL (tipos, ensamblados, etc.) en tiempo de ejecución .
  • La plataforma de compilación .NET (Roslyn) proporciona acceso API a los servicios de compilación de lenguajes, lo que permite compilar código C# desde dentro de las aplicaciones .NET. Expone API para el análisis sintáctico ( léxico ) del código, el análisis semántico , la compilación dinámica a CIL y la emisión de código. [ 80 ]
  • Los generadores de código fuente, [ 81 ] una característica del compilador Roslyn C#, permiten la metaprogramación en tiempo de compilación. Durante el proceso de compilación, los desarrolladores pueden inspeccionar el código que se está compilando con la API del compilador y pasar código fuente C# generado adicional para su compilación.

Métodos y funciones

Un método en C# es un miembro de una clase que puede ser invocado como una función , en lugar de la mera capacidad de almacenar valores de un campo , es decir, una variable de clase o de instancia . [ 82 ] 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 ), la especificación explícita de su tipo de retorno (como , o la palabra clave 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 consiste en el tipo de un parámetro, su nombre formal y, opcionalmente, un valor predeterminado que se utilizará cuando no se proporcione ninguno. A diferencia de la mayoría de los demás lenguajes, los parámetros de paso por referencia deben marcarse tanto en la definición de la función como en el sitio de llamada, y el programador puede elegir entre y , este último permite pasar una variable no inicializada que tendrá un valor definido al regresar. [ 83 ] Además, el programador puede especificar una lista de argumentos de tamaño variable aplicando la palabra clave al último parámetro. [ 84 ] Ciertos tipos específicos de métodos, como aquellos que simplemente obtienen o establecen el valor de un campo devolviéndolo o asignándolo, no requieren una firma completa explícitamente indicada, pero en el caso general, la definición de una clase incluye la declaración de firma completa de sus métodos. [ 85 ]privateintvoidrefoutparams

Al igual que en C++, y a diferencia de Java, los programadores de C# deben usar la palabra clave `scope` para permitir que las subclases sobrescribanvirtual métodos . A diferencia de C++, el programador debe especificar explícitamente la palabra clave al hacerlo. [ 86 ] Esto tiene como objetivo evitar confusiones entre sobrescribir y sobrecargar una función, es decir, ocultar la primera implementación. Para hacer lo segundo, el programador debe especificar la palabra clave. [ 87 ] La palabra clave se puede usar para impedir más sobrescrituras para métodos individuales o clases completas. [ 88 ]overridenewsealed

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 les permite agregar virtualmente métodos de instancia a una clase que, a su juicio, deberían existir en ese tipo de objetos (y en las instancias de las clases derivadas correspondientes). [ 17 ] : 103–105 [ 21 ] : 202–203

Este tipo dynamicpermite la vinculación de métodos en tiempo de ejecución, lo que posibilita llamadas a métodos similares a las de JavaScript y la composición de objetos en tiempo de ejecución . [ 17 ] : 114–118

C# admite punteros a funciones fuertemente tipados mediante la palabra clave ` delegate.`. Al igual que la señal y la ranura pseudo -C++ del framework Qt , C# tiene una semántica específica para eventos de estilo publicación-suscripción, aunque C# utiliza delegados para ello. A diferencia de los campos, las variables pueden formar parte de una interfaz, ya que técnicamente constan de dos funciones predeterminadas para agregar y eliminar delegados que se van a llamar.event

C# ofrece llamadas a métodos similares a las de Java synchronized, a través del atributo [MethodImpl(MethodImplOptions.Synchronized)], y admite bloqueos mutuamente excluyentes a través de la palabra clave lock.

Propiedades

C# admite clases con propiedades . Las propiedades pueden ser funciones de acceso simples con un campo de respaldo, o implementar funciones de obtención y establecimiento arbitrarias. Una propiedad es de solo lectura si no tiene un método de establecimiento. Al igual que con los campos, puede haber propiedades de clase e instancia. Los métodos subyacentes pueden ser de solo lectura virtualo abstractcomo cualquier otro método. [ 85 ]

Desde C# 3.0 está disponible el azúcar sintáctico de las propiedades autoimplementadas, [ 89 ] donde el accesor (getter) y el mutador (setter) encapsulan operaciones en un solo campo de una clase.

Espacios de nombres

AC# namespaceproporciona el mismo nivel de aislamiento de código que Java packageo 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". [ 90 ]

Acceso a la memoria

En C#, los punteros a direcciones de memoria solo se pueden usar dentro de bloques específicamente marcados como inseguros , [ 91 ] y los programas con código inseguro necesitan los permisos adecuados para ejecutarse. La mayoría del acceso a objetos se realiza a través de referencias de objetos seguras, que siempre apuntan a un objeto "vivo" o tienen el valor nulo bien definido ; es imposible obtener una referencia a un objeto "muerto" (uno que ha sido recolectado por el recolector de basura) o a un bloque de memoria arbitrario. Un puntero inseguro puede apuntar a una instancia de un tipo de valor no administrado que no contiene ninguna referencia a objetos sujetos a recolección de basura, como instancias de clases, matrices o cadenas. El código que no está marcado como inseguro aún puede almacenar y manipular punteros a través del System.IntPtrtipo, pero no puede desreferenciarlos.

La memoria administrada no se puede liberar explícitamente; en su lugar, se elimina automáticamente mediante la recolección de basura . La recolección de basura resuelve el problema de las fugas de memoria al liberar al programador de la responsabilidad de liberar la memoria que ya no se necesita en la mayoría de los casos. El código que mantiene referencias a objetos durante más tiempo del necesario aún puede experimentar un mayor consumo de memoria del necesario; sin embargo, una vez que se libera la última referencia a un objeto, la memoria queda disponible para la recolección de basura.

Excepciones

Los programadores disponen de una variedad de excepciones estándar . Los métodos de las bibliotecas estándar suelen generar excepciones del sistema en determinadas circunstancias, y el tipo de excepciones que se generan normalmente está documentado. Se pueden definir clases de excepción personalizadas para las clases, lo que permite implementar el manejo necesario para cada circunstancia. [ 92 ]

La sintaxis para el manejo de excepciones es la siguiente:

try { // algo } catch ( Exception ex ) { // si hay error, hacer esto } finally { // siempre se ejecuta, independientemente de si ocurre un error }

Esto se suele denominar bloque de código "try-catch", debido a que las funciones "try" y "catch" se utilizan y están disponibles en todas las versiones de C#. La parte "finally" puede omitirse. Si no es necesario inspeccionar los detalles del error, el (Exception ex)parámetro también puede omitirse. Además, puede haber varias partes "catch" que gestionen diferentes tipos de excepciones. [ 93 ]

En C# no existen excepciones verificadas (a diferencia de Java). Esta ha sido una decisión deliberada basada en cuestiones de escalabilidad y gestión de versiones. [ 94 ]

Polimorfismo

A diferencia de C++ , C# no admite la herencia múltiple , aunque una clase puede implementar cualquier número de " interfaces " (clases totalmente 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 que aceptan parámetros del mismo tipo en el mismo orden, es decir, con la misma firma , de forma similar a Java , C# permite tanto un único método para cubrir todas las interfaces como, si es necesario, métodos específicos para cada interfaz.

C# también ofrece sobrecarga de funciones (también conocida como polimorfismo ad hoc ), es decir, métodos con el mismo nombre, pero firmas distinguibles. [ 95 ] A diferencia de Java, C# admite además sobrecarga de operadores . [ 96 ]

Desde la versión 2.0, C# ofrece polimorfismo paramétrico , es decir, clases con parámetros de tipo arbitrarios o restringidos, por ejemplo , un array de tamaño variable que solo puede contener elementos de tipo . Existen ciertos tipos de restricciones que el programador puede especificar para los parámetros de tipo: debe ser de tipo X ( o uno derivado de él ), debe implementar una interfaz determinada, debe ser un tipo de referencia, debe ser un tipo de valor, debe implementar un constructor público sin parámetros . La mayoría de ellas se pueden combinar y se puede especificar cualquier número de interfaces. [ 97 ] [ 98 ]List<T>T

Consulta integrada en el lenguaje (LINQ)

C# tiene la capacidad de utilizar LINQ a través del .NET Framework. Un desarrollador puede consultar diversas fuentes de datos, siempre que la interfaz esté implementada en el objeto. Esto incluye documentos XML , un conjunto de datos ADO.NET y bases de datos SQL . [ 99 ]IEnumerable<T>

El uso de LINQ en C# ofrece ventajas como compatibilidad con IntelliSense , sólidas capacidades de filtrado, seguridad de tipos con comprobación de errores de compilación y consistencia para consultar datos de diversas fuentes. [ 100 ] Existen varias estructuras de lenguaje que se pueden utilizar con C# y LINQ, como expresiones de consulta, expresiones lambda, tipos anónimos, variables con tipado implícito, métodos de extensión e inicializadores de objetos. [ 101 ]

LINQ tiene dos sintaxis: sintaxis de consulta y sintaxis de método. Sin embargo, el compilador siempre convierte la sintaxis de consulta a sintaxis de método en tiempo de compilación. [ 102 ]

usando System.Linq ;var numbers = new int [] { 5 , 10 , 8 , 3 , 6 , 12 };// Sintaxis de consulta (SELECT num FROM numbers WHERE num % 2 = 0 ORDER BY num) var numQuery1 = from num in numbers where num % 2 == 0 orderby num select num ;// Sintaxis del método var numQuery2 = números . Donde ( núm => núm % 2 == 0 ) . Ordenar por ( n => n );

Programación funcional

Aunque principalmente es un lenguaje imperativo, C# siempre añade características funcionales con el tiempo, [ 103 ] [ 104 ] por ejemplo:

Sistema de tipos común

C# tiene un sistema de tipos unificado . Este sistema de tipos unificado se llama Sistema de Tipos Comunes (CTS). [ 111 ] : Parte 2, Capítulo 4: El sistema de tipos

Un sistema de tipos unificado implica que todos los tipos, incluidos los primitivos como los enteros, son subclases de la clase. Por ejemplo, cada tipo hereda un método.System.ObjectToString()

Categorías de tipos de datos

CTS separa los tipos de datos en dos categorías: [ 111 ]

  1. Tipos de referencia
  2. 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 derivar unos de otros (pero pueden implementar interfaces) y no pueden tener un constructor predeterminado explícito (sin parámetros) porque ya tienen uno implícito que inicializa todos los datos contenidos al valor predeterminado dependiente del tipo (0, null o similar). Ejemplos de tipos de valor son todos los tipos primitivos, como (un entero con signo de 32 bits), (un número de punto flotante IEEE de 32 bits), (una unidad de código Unicode de 16 bits), (números de punto fijo útiles para manejar cantidades de moneda) y (identifica un punto específico en el tiempo con precisión de nanosegundos). Otros ejemplos son (enumeraciones) y (estructuras definidas por el usuario).System.ValueTypeintfloatchardecimalSystem.DateTimeenumstruct

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 de igualdad y desigualdad predeterminadas 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 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. Sin embargo, 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 clase base definitiva para todas las demás clases de C#), (una cadena de caracteres Unicode) y (una clase base para todos los arreglos de C#).System.StringICloneableIComparableobjectSystem.StringSystem.Array

Ambas categorías de tipos son extensibles mediante tipos definidos por el usuario.

Empaquetado y desempaquetado

El boxing es la operación de convertir un objeto de tipo valor en un valor de un tipo de referencia correspondiente. [ 111 ] El boxing en C# es implícito.

El desempaquetado es la operación de convertir un valor de un tipo de referencia (previamente empaquetado) en un valor de un tipo de valor. [ 111 ] El desempaquetado en C# requiere una conversión de tipo explícita . Un objeto empaquetado de tipo T solo puede desempaquetarse a un T (o un T anulable). [ 112 ]

Ejemplo:

int foo = 42 ; // Tipo de valor. object bar = foo ; // foo se convierte en bar. int foo2 = ( int ) bar ; // Se vuelve a convertir en tipo de valor.

Bibliotecas

La especificación de 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 la Infraestructura de Lenguaje Común (CLI), que está estandarizada como ECMA-335 Infraestructura de Lenguaje Común (CLI) .

Además de las especificaciones estándar de la CLI, existen muchas bibliotecas de clases comerciales y comunitarias que se basan en las bibliotecas del marco .NET para proporcionar funcionalidad adicional. [ 113 ]

C# puede realizar llamadas a cualquier biblioteca incluida en la Lista de bibliotecas y frameworks de .NET .

Ejemplos

Hola Mundo

El siguiente es un programa C# muy simple, una versión del clásico ejemplo " Hola Mundo " que utiliza la característica de sentencias de nivel superior introducida en C# 9: [ 114 ]

Consola.WriteLine ( " ¡ Hola, mundo!" ) ;

Para el código escrito en C# 8 o inferior, la lógica del punto de entrada de un programa debe estar escrita en un método Main dentro de un tipo:

usando el sistema ;clase Programa { static void Main () { 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 del Systemespacio de nombres. Por ejemplo, la Consoleclase que se usa más adelante en el código fuente está definida en dicho Systemespacio de nombres, lo que significa que se puede usar sin especificar el nombre completo del tipo (que incluye el espacio de nombres).

// Una versión del clásico programa "Hola Mundo"

Esta línea es un comentario; describe y documenta el código para el/los programador/es.

Programa de clases

Arriba se muestra la definición de la claseProgram . Todo lo que aparece entre las llaves describe dicha clase.

{ ... }

Las llaves delimitan los límites de un bloque de código. En este primer caso, marcan el inicio y el final de la Programclase.

estático void Main ()

Esto declara el método miembro de la clase donde comienza la ejecución del programa. El entorno de ejecución de .NET llama al Mainmétodo. A diferencia de Java , el Mainmétodo no necesita la publicpalabra clave, que le indica al compilador que el método puede ser llamado desde cualquier lugar por cualquier clase. [ 115 ] Escribir es equivalente a escribir . La palabra clave static 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 un error si no hay ningún método. La palabra clave declara que no tiene valor de retorno . (Tenga en cuenta, sin embargo, que se pueden escribir programas cortos utilizando las instrucciones de nivel superior introducidas en C# 9, como se mencionó anteriormente).staticvoidMain(string[]args)privatestaticvoidMain(string[]args)ProgramMainstaticProgramstaticMainvoidMain

Consola.WriteLine ( " ¡ Hola, mundo!" ) ;

Esta línea escribe la salida. Consolees una clase estática en el Systemespacio de nombres. Proporciona una interfaz para la entrada/salida estándar y los flujos de error para aplicaciones de consola. El programa llama al Consolemétodo WriteLine, que muestra en la consola una línea con el argumento, la cadena "Hello, World!".

Medicamentos genéricos

Con .NET 2.0 y C# 2.0, la comunidad obtuvo colecciones más flexibles que las de .NET 1.x. En ausencia de genéricos, los desarrolladores tenían que usar colecciones como ArrayList para almacenar elementos como objetos de tipo no especificado, lo que generaba una sobrecarga de rendimiento al convertir/desconvertir/verificar el tipo de los elementos contenidos.

Los genéricos introdujeron una nueva característica fundamental en .NET que permitió a los desarrolladores crear estructuras de datos con tipado seguro. Este cambio es particularmente importante en el contexto de la conversión de sistemas heredados, donde la actualización a genéricos puede mejorar significativamente el rendimiento y la mantenibilidad al reemplazar las estructuras de datos obsoletas con alternativas más eficientes y con tipado seguro. [ 116 ]

Ejemplo

public class DataStore < T > { private T [] items = new T [ 10 ]; private int count = 0 ;public void Agregar ( T item ) { items [ count ++ ] = item ; }public T Get ( int index ) { return items [ index ]; } }

Estandarización y concesión de licencias

En agosto de 2001, Microsoft , Hewlett-Packard e Intel copatrocinaron la presentación de especificaciones para C# y la Infraestructura de Lenguaje Común (CLI) a la organización de estándares Ecma International . En diciembre de 2001, ECMA publicó la Especificación del Lenguaje C# ECMA-334 . C# se convirtió en un estándar ISO / IEC en 2003 (ISO/IEC 23270:2003 - Tecnología de la información — Lenguajes de programación — C# ). ECMA ya había adoptado especificaciones equivalentes como la segunda edición de C#, en diciembre de 2002. En junio de 2005, ECMA aprobó la edición 3 de la especificación de C# y actualizó ECMA-334. Las adiciones incluyeron clases parciales, métodos anónimos, tipos anulables y genéricos (algo similar a las plantillas de C++ ). En julio de 2005, ECMA presentó a ISO/IEC JTC 1/SC 22, a través del proceso de vía rápida de este último, los estándares y los TR relacionados. Este proceso suele durar entre 6 y 9 meses.

La definición del lenguaje C# y la interfaz de línea de comandos (CLI) están estandarizadas según las normas ISO/IEC y Ecma , que proporcionan una protección de licencias razonable y no discriminatoria frente a las reclamaciones de patentes.

Microsoft inicialmente acordó no demandar a los desarrolladores de código abierto por violar patentes en proyectos sin fines de lucro para la parte del marco que está cubierta por la Promesa de Especificación Abierta . [ 117 ] Microsoft también acordó no hacer valer las patentes relacionadas con los productos de Novell contra los clientes de pago de Novell [ 118 ] con la excepción de una lista de productos que no mencionan explícitamente C#, .NET o la implementación de .NET de Novell ( The Mono Project ). [ 119 ] Sin embargo, Novell sostuvo que Mono no infringe ninguna patente de Microsoft. [ 120 ] Microsoft también hizo un acuerdo específico para no hacer valer los derechos de patente relacionados con el complemento del navegador Moonlight , que depende de Mono, siempre que se obtenga a través de Novell. [ 121 ]

Una década más tarde, Microsoft comenzó a desarrollar herramientas gratuitas, de código abierto y multiplataforma para C#, como Visual Studio Code , .NET Core y Roslyn . Mono se unió a Microsoft como un proyecto de Xamarin , una filial de Microsoft.

Implementaciones

Microsoft ha desarrollado compiladores y herramientas de referencia de C# de código abierto . El primer compilador, Roslyn , compila en lenguaje intermedio (IL), y el segundo, RyuJIT, [ 122 ] es un compilador JIT (justo a tiempo), que es dinámico y realiza optimización sobre la marcha y compila el IL en código nativo para el front-end de la CPU. [ 123 ] RyuJIT es de código abierto y está escrito en C++. [ 124 ] Roslyn está escrito completamente en código administrado (C#), se ha abierto y la funcionalidad se ha expuesto como API. Por lo tanto, permite a los desarrolladores crear herramientas de refactorización y diagnóstico. [ 5 ] [ 125 ] Dos ramas de implementación oficial son .NET Framework (código cerrado, solo para Windows) y .NET Core (código abierto, multiplataforma); finalmente convergieron en una implementación de código abierto: .NET 5.0. [ 126 ] En .NET Framework 4.6, un nuevo compilador JIT reemplazó al anterior. [ 122 ] [ 127 ]

Otros compiladores de C# (algunos de los cuales incluyen una implementación de la infraestructura de lenguaje común y las bibliotecas de clases .NET):

  • Mono , un proyecto patrocinado por Microsoft, proporciona un compilador de C# de código abierto, una implementación completa de código abierto de la CLI (incluidas las bibliotecas de framework necesarias tal como aparecen en la especificación ECMA) y una implementación casi completa de las bibliotecas de clases .NET hasta .NET Framework 3.5.
  • El conjunto de herramientas Elements de RemObjects incluye RemObjects C#, que compila código C# a Common Intermediate Language (CID) de .NET , bytecode de Java , Cocoa , bytecode de Android , WebAssembly y código máquina nativo para Windows, macOS y Linux.
  • El proyecto DotGNU (actualmente discontinuado) también proporcionaba un compilador C# de código abierto, una implementación casi completa de la Infraestructura de Lenguaje Común, incluidas las bibliotecas de marco necesarias tal como aparecen en la especificación ECMA, y un subconjunto de algunas de las bibliotecas de clases .NET propietarias restantes de Microsoft hasta .NET 2.0 (aquellas que no están documentadas ni incluidas en la especificación ECMA, pero sí incluidas en la distribución estándar de .NET Framework de Microsoft).

El motor de juegos Unity utiliza C# como su lenguaje de scripting principal. El motor de juegos Godot ha implementado un módulo C# opcional gracias a una donación de 24.000 dólares de Microsoft. [ 128 ]

Véase también

Notas

  1. para asíncrono
  2. Por convención,en el texto normal se utiliza un signo de numeral para el segundo carácter; en las representaciones artísticas, a veces se utiliza un verdadero sostenido : C♯. Sin embargo, la norma ECMA 334 establece: «El nombre C# se escribe como la LETRA MAYÚSCULA LATINA C (U+0043) seguida del SIGNO DE NUMÉRICO # (U+0023)».
  3. Las versiones 1.0, 2.0 y 5.0 del lenguaje están disponibles como ISO/IEC 23270. A partir de la versión 7.0, la especificación está disponible como ISO/IEC 20619.
  4. El documento de especificación de Microsoft C# 2.0 solo contiene las nuevas características de la versión 2.0. Para características anteriores, utilice la especificación 1.2 mencionada anteriormente.

Referencias

Citas

  1. 1 2 3 4 5 6 Especificación del lenguaje C# (PDF) (4.ª  ed.). Ecma International . Junio ​​de 2006. Archivado (PDF) del original el 21 de abril de 2021. Recuperado el 26 de enero de 2012 .
  2. "InfoQ eMag: Un adelanto de C# 7" . Archivado del original el 24 de abril de 2023. Consultado el 11 de noviembre de 2016 .
  3. "Novedades de .NET 10" . Consultado el 13 de noviembre de 2025 .
  4. Torgersen, Mads (27 de octubre de 2008). "Nuevas características en C# 4.0" . Microsoft . Archivado del original el 3 de enero de 2012. Recuperado el 28 de octubre de 2008 .
  5. 1 2 "El compilador Roslyn .NET proporciona a los lenguajes C# y Visual Basic ricas API de análisis de código: dotnet/roslyn" . 13 de noviembre de 2019. Archivado del original el 22 de febrero de 2021. Recuperado el 13 de febrero de 2015 a través de GitHub.
  6. "CoreCLR es el entorno de ejecución de .NET Core. Incluye el recolector de basura, el compilador JIT, los tipos de datos primitivos y las clases de bajo nivel: dotnet/coreclr" . 13 de noviembre de 2019. Archivado del original el 14 de octubre de 2019. Recuperado el 8 de marzo de 2017 a través de GitHub.
  7. 1 2 Naugler, David (mayo de 2007). "C# 2.0 para programadores de C++ y Java: taller de conferencia". Journal of Computing Sciences in Colleges . 22 (5). Aunque C# ha sido fuertemente influenciado por Java, también ha sido fuertemente influenciado por C++ y se considera mejor como un descendiente tanto de C++ como de Java.
  8. Hamilton, Naomi (1 de octubre de 2008). "El AZ de los lenguajes de programación: C#" . Computerworld . Archivado del original el 24 de marzo de 2010. Recuperado el 12 de febrero de 2010. Todos nos apoyamos en los hombros de gigantes y cada lenguaje se construye sobre lo que lo precedió, por lo que le debemos mucho a C, C++, Java, Delphi y a todos los demás lenguajes que nos precedieron. ( Anders Hejlsberg )
  9. "Especificaciones de la capilla (Agradecimientos)" (PDF) . Cray Inc. 1 de octubre de 2015. Archivado del original (PDF) el 5 de febrero de 2016. Consultado el 14 de enero de 2016 .
  10. "Preguntas y respuestas de Rich Hickey por Michael Fogus" . Archivado del original el 11 de enero de 2017. Consultado el 11 de enero de 2017 .
  11. Borenszweig, Ary (14 de junio de 2016). "¡Crystal 0.18.0 lanzado!" . Archivado del original el 25 de diciembre de 2018. Recuperado el 7 de agosto de 2017. Está fuertemente inspirado en Ruby y otros lenguajes (como C#, Go y Python).
  12. "Lenguajes web y máquinas virtuales: el código rápido siempre está de moda. (V8, Dart) - Google I/O 2013" . YouTube . 16 de mayo de 2013. Archivado del original el 21 de diciembre de 2021. Consultado el 22 de diciembre de 2013 .
  13. Java 5.0 añadió varias características nuevas al lenguaje (el bucle for mejorado , el autoboxing , los argumentos variables y las anotaciones ), después de que se introdujeran en el lenguaje C#, similar y competidor.Archivado el 19 de marzo de 2011 en Wayback Machine .Archivado el 7 de enero de 2006 en Wayback Machine .
  14. Cornelius, Barry (1 de diciembre de 2005). "Java 5 alcanza a C#" . Servicios Informáticos de la Universidad de Oxford . Archivado del original el 6 de marzo de 2023. Recuperado 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 )
  15. "Influencias - The Rust Reference" . The Rust Reference . Archivado del original el 26 de enero de 2019. Consultado el 18 de abril de 2023 .
  16. Lattner, Chris (3 de junio de 2014). "Página web de Chris Lattner" . Chris Lattner. Archivado del original el 25 de diciembre de 2018. Recuperado el 12 de mayo de 2020. El lenguaje Swift es producto del esfuerzo incansable de un equipo de expertos en lenguajes, gurús de la documentación, ninjas de la optimización de compiladores y un grupo interno de pruebas internas increíblemente importante que proporcionó retroalimentación 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, tomando ideas de Objective-C, Rust, Haskell, Ruby, Python, C#, CLU y demasiados otros para enumerar.
  17. 1 2 3 4 5 6 7 Skeet 2019 .
  18. Wagner, Bill. "Novedades de C# 14" . learn.microsoft.com . Consultado el 13 de septiembre de 2025 .
  19. Dollard, Kathleen (14 de noviembre de 2023). "Anuncio de C# 12" . Blog de .NET . Archivado del original el 18 de noviembre de 2023. Consultado el 18 de noviembre de 2023 .
  20. Seth, Gaurav (14 de noviembre de 2023). "Anuncio de .NET 8" . Blog de .NET . Archivado del original el 19 de noviembre de 2023. Consultado el 18 de noviembre de 2023 .
  21. 1 2 3 4 5 6 Albahari 2022 .
  22. "Objetivos de diseño de C#" . www.java-samples.com . Archivado del original el 6 de octubre de 2021. Consultado el 6 de octubre de 2021 .
  23. Zander, Jason (21 de noviembre de 2007). "Un par de hechos históricos" . Archivado del original el 29 de julio de 2020. Recuperado el 9 de septiembre de 2025 .
  24. Guthrie, Scott (28 de noviembre de 2006). "¿En qué lenguaje se escribió originalmente ASP.Net?" . Archivado del original el 24 de junio de 2016. Recuperado el 21 de febrero de 2008 .
  25. Hamilton (1 de octubre de 2008). "El AZ de los lenguajes de programación: C#" . Computerworld . Archivado del original el 18 de mayo de 2019. Consultado el 9 de septiembre de 2025 .
  26. "Detalles" . nilsnaegele.com . Archivado del original el 7 de abril de 2019. Consultado el 7 de abril de 2019 .
  27. "Por qué C# de Microsoft no lo es" . CNET: CBS Interactive. 2002. Archivado del original el 14 de agosto de 2023. Consultado el 18 de septiembre de 2023 .
  28. Joy, Bill (7 de febrero de 2002). "El punto ciego de Microsoft" . cnet.com. Archivado del original el 14 de agosto de 2023. Consultado el 18 de septiembre de 2023 .
  29. Osborn, John (1 de agosto de 2000). "En lo profundo de C#: una entrevista con el arquitecto jefe de Microsoft, Anders Hejlsberg" . O'Reilly Media. Archivado del original el 9 de enero de 2010. Recuperado el 14 de noviembre de 2009 .
  30. "Genéricos (Guía de programación en C#)" . Microsoft. Archivado del original el 26 de agosto de 2011. Consultado el 21 de marzo de 2011 .
  31. Don Box y Anders Hejlsberg (febrero de 2007). "LINQ: Consulta integrada en el lenguaje .NET" . Microsoft. Archivado del original el 24 de agosto de 2011. Recuperado el 21 de marzo de 2011 .
  32. Mercer, Ian (15 de abril de 2010). "Por qué la programación funcional y LINQ suelen ser mejores que el código procedimental" . abodit.com. Archivado del original el 11 de julio de 2011. Recuperado el 21 de marzo de 2011 .
  33. Fernández, Dan (29 de enero de 2004). "Andy se retira" . Blog de Dan Fernández . Blogs.msdn.com. Archivado del original el 19 de enero de 2012. Consultado el 4 de octubre de 2012 .
  34. "Comités técnicos - JTC 1/SC 22 - Lenguajes de programación, sus entornos e interfaces de software de sistema" . ISO. Archivado del original el 27 de septiembre de 2012. Recuperado el 4 de octubre de 2012 .
  35. "ISO/IEC 23270:2003 - Tecnología de la información - Especificación del lenguaje C#" . Iso.org. 23 de agosto de 2006. Archivado del original el 8 de mayo de 2012. Consultado el 4 de octubre de 2012 .
  36. "ISO/IEC 23270:2006 - Tecnología de la información - Lenguajes de programación - C#" . Iso.org. 26 de enero de 2012. Archivado del original el 6 de diciembre de 2010. Consultado el 4 de octubre de 2012 .
  37. "SO/IEC 23270:2018 Tecnología de la información — Lenguajes de programación — C#" . ISO . Consultado el 26 de noviembre de 2020 .
  38. Mariani, Rico (5 de octubre de 2009). "Mi historia con Visual Studio (Parte 1) – Consejos de rendimiento de Rico Mariani" . Consejos de rendimiento de Rico Mariani . Archivado del original el 27 de mayo de 2018. Recuperado el 26 de mayo de 2018 .
  39. Kovacs, James (7 de septiembre de 2007). "Lección de historia de C#/.NET" . Archivado del original el 6 de marzo de 2009. Recuperado el 18 de junio de 2009 .
  40. Hejlsberg, Anders (1 de octubre de 2008). "El AZ de los lenguajes de programación: C#" . Computerworld . Archivado del original el 2 de abril de 2015. Recuperado el 22 de junio de 2014 .
  41. "Preguntas frecuentes sobre Microsoft C#" . Microsoft . Archivado del original el 14 de febrero de 2006. Consultado el 25 de marzo de 2008 .
  42. "Preguntas frecuentes sobre F#" . Microsoft Research. Archivado del original el 18 de febrero de 2009. Consultado el 18 de junio de 2009 .
  43. Simon, Raphael; Stapf, Emmanuel; Meyer, Bertrand (junio de 2002). "Full Eiffel on the .NET Framework" . Microsoft . Archivado del original el 21 de julio de 2009. Recuperado el 18 de junio de 2009 .
  44. "Novedades del lenguaje y compilador C# 2.0" . Microsoft. Archivado del original el 18 de diciembre de 2010. Consultado el 11 de junio de 2014 .
  45. Hejlsberg, Anders; Torgersen, Mads (30 de abril de 2007). "Descripción general de C# 3.0" . Microsoft Developer Network . Microsoft. Archivado del original el 25 de junio de 2014. Recuperado el 11 de junio de 2014 .
  46. 1 2 "Usando C# 3.0 desde .NET 2.0" . Danielmoth.com. 13 de mayo de 2007. Archivado del original el 29 de septiembre de 2012. Recuperado el 4 de octubre de 2012 .
  47. Hejlsberg, Anders (15 de septiembre de 2011). "Direcciones futuras para C# y Visual Basic" . Canal 9. BUILD2011. Microsoft. Archivado del original el 23 de septiembre de 2011. Recuperado el 21 de septiembre de 2011 .
  48. "Introducción a las nuevas características de C# 5.0" . Blog del programa de premios Microsoft MVP . Microsoft. 26 de marzo de 2012. Archivado del original el 4 de junio de 2014. Consultado el 11 de junio de 2014 .
  49. "Características de los lenguajes en C# 6 y VB 14" . GitHub . dotnet/roslyn. Archivado del original el 12 de enero de 2016. Consultado el 13 de febrero de 2015 .
  50. "Novedades de C# 7" . Microsoft Docs . 21 de diciembre de 2016. Archivado del original el 1 de noviembre de 2017.
  51. Torgersen, Mads (9 de marzo de 2017). "Nuevas características en C# 7.0" . Blog de .NET . Microsoft. Archivado del original el 11 de abril de 2017. Consultado el 9 de junio de 2017 .
  52. "Notas de la versión 15.0 de Visual Studio 2017" . Microsoft Learn . 11 de abril de 2023. Archivado del original el 20 de abril de 2023. Consultado el 19 de abril de 2023 .
  53. "Novedades de C# 7.1" . Microsoft Docs . Archivado del original el 10 de octubre de 2017. Consultado el 9 de octubre de 2017 .
  54. "Notas de la versión 15.3 de Visual Studio 2017" . Microsoft Learn . 11 de abril de 2023. Archivado del original el 21 de marzo de 2023. Consultado el 19 de abril de 2023 .
  55. "Novedades de C# 7.2" . Microsoft Docs . Archivado del original el 1 de diciembre de 2017. Consultado el 26 de noviembre de 2017 .
  56. "Notas de la versión 15.5 de Visual Studio 2017" . Microsoft Learn . 11 de abril de 2023. Archivado del original el 20 de abril de 2023. Consultado el 19 de abril de 2023 .
  57. "Novedades de C# 7.3" . Microsoft Docs . Archivado del original el 23 de junio de 2018. Consultado el 23 de junio de 2018 .
  58. "Notas de la versión 15.7 de Visual Studio 2017" . Microsoft Learn . 13 de julio de 2022. Archivado del original el 20 de abril de 2023. Consultado el 19 de abril de 2023 .
  59. "Novedades de C# 8.0" . Microsoft Docs . 9 de marzo de 2023. Archivado del original el 6 de septiembre de 2020. Consultado el 14 de abril de 2019 .
  60. "Notas de la versión 16.3 de Visual Studio 2019" . Microsoft Learn . 11 de abril de 2023. Archivado del original el 20 de abril de 2023. Consultado el 19 de abril de 2023 .
  61. BillWagner. "Novedades de C# 9.0 - Guía de C#" . Microsoft Learn . Archivado del original el 5 de septiembre de 2020. Consultado el 15 de octubre de 2020 .
  62. "Notas de la versión 16.8 de Visual Studio 2019" . Microsoft Learn . 11 de abril de 2023. Archivado del original el 20 de abril de 2023. Consultado el 19 de abril de 2023 .
  63. "Novedades de C# 10" . Microsoft Learn . Archivado del original el 8 de febrero de 2022. Consultado el 10 de noviembre de 2021 .
  64. "Notas de la versión 17.0 de Visual Studio 2022" . Microsoft Learn . Archivado del original el 16 de julio de 2023. Consultado el 19 de abril de 2023 .
  65. "Novedades de C# 11" . Microsoft Learn . Archivado del original el 15 de agosto de 2022. Consultado el 8 de agosto de 2022 .
  66. "Notas de la versión 17.4 de Visual Studio 2022" . Microsoft Learn . Archivado del original el 6 de agosto de 2023. Consultado el 19 de abril de 2023 .
  67. "Novedades de C# 12" . Microsoft Learn . Archivado del original el 20 de julio de 2023. Consultado el 29 de junio de 2023 .
  68. "Notas de la versión 17.8 de Visual Studio 2022" . Microsoft Learn . 13 de agosto de 2024. Archivado del original el 6 de octubre de 2024. Consultado el 18 de noviembre de 2024 .
  69. "Novedades de C# 13" . Microsoft Learn . Archivado del original el 13 de noviembre de 2024. Consultado el 18 de noviembre de 2024 .
  70. "Notas de la versión de Visual Studio 2022" . Microsoft Learn . 12 de noviembre de 2024. Archivado del original el 12 de noviembre de 2024. Consultado el 18 de noviembre de 2024 .
  71. "Novedades de C# 14" . Microsoft Learn . Consultado el 18 de noviembre de 2025 .
  72. "Notas de la versión de Visual Studio 2026" . Microsoft Learn . 12 de noviembre de 2025. Consultado el 18 de noviembre de 2025 .
  73. Novák et al. 2010 .
  74. stevewhims; mattwojo (20 de octubre de 2022). "Compilación de aplicaciones con .NET Native - Aplicaciones UWP" . learn.microsoft.com . Archivado del original el 27 de octubre de 2023. Consultado el 27 de octubre de 2023 .
  75. LakshanF; agocke; Rick-Anderson; et al. (12 de septiembre de 2023). "Descripción general de la implementación AOT nativa - .NET" . learn.microsoft.com . Archivado del original el 11 de noviembre de 2023. Recuperado el 27 de octubre de 2023 . {{cite web}}: CS1 maint: nombres numéricos: lista de autores ( enlace )
  76. "Tipos/General, parte de la documentación oficial de C#" . Microsoft . Archivado del original el 29 de marzo de 2024. Consultado el 6 de abril de 2024 .
  77. BillWagner. "Árboles de expresiones (C#)" . Microsoft Learn . Archivado del original el 15 de mayo de 2021. Consultado el 14 de mayo de 2021 .
  78. "Clase de atributo" .
  79. dotnet-bot. "Espacio de nombres System.Reflection.Emit" . learn.microsoft.com . Archivado del original el 28 de abril de 2023. Consultado el 28 de abril de 2023 .
  80. McAllister, Neil (20 de octubre de 2011). "Roslyn de Microsoft: reinventando el compilador tal como lo conocemos" . InfoWorld . Archivado del original el 5 de marzo de 2022. Recuperado el 5 de marzo de 2022 .
  81. "Introducción a los generadores de código fuente de C#" . Blog de .NET . 29 de abril de 2020. Archivado del original el 7 de mayo de 2021. Consultado el 14 de mayo de 2021 .
  82. "Clases/campos, parte de la documentación oficial de C#" . 7 de febrero de 2024.
  83. "out (C# Reference)" . 30 de marzo de 2024.
  84. "Parámetros de método/modificador params, parte de la documentación oficial de C#" . 21 de mayo de 2024.
  85. 1 2 "Clases/propiedades, parte de la documentación oficial de C#" . 7 de febrero de 2024.
  86. "virtual (C# Reference)" . Microsoft Learn . 15 de septiembre de 2021. Archivado del original el 30 de agosto de 2018. Consultado el 4 de abril de 2018 .
  87. " Nuevo modificador, parte de la documentación oficial de C#" . 12 de abril de 2023.
  88. "Clases abstractas y selladas y miembros de clase - C#" . 27 de octubre de 2021.
  89. "Propiedades implementadas automáticamente (Guía de programación en C#)" . Archivado del original el 29 de octubre de 2020. Consultado el 12 de septiembre de 2020 .
  90. "directiva using - Referencia de C#" . Microsoft Docs . Archivado del original el 14 de abril de 2019. Consultado el 14 de abril de 2019 .
  91. BillWagner. "Código inseguro, punteros a datos y punteros a funciones" . Microsoft Learn . Archivado del original el 4 de julio de 2021. Consultado el 20 de junio de 2021 .
  92. "Cómo crear excepciones definidas por el usuario" . Archivado del original el 26 de enero de 2021. Consultado el 12 de septiembre de 2020 .
  93. "Instrucciones de manejo de excepciones, parte de la documentación oficial de C#" . Microsoft Learn . 22 de abril de 2023. Consultado el 26 de junio de 2024 .
  94. Venners, Bill; Eckel, Bruce (18 de agosto de 2003). "El problema de las excepciones verificadas" . Archivado del original el 18 de febrero de 2015. Recuperado el 30 de marzo de 2010 .
  95. "Expresiones/Resolución de sobrecarga, parte de la documentación oficial de C#" . Microsoft Learn . 7 de febrero de 2024. Consultado el 7 de abril de 2024 .
  96. BillWagner. "Sobrecarga de operadores - Referencia de C#" . Microsoft Learn . Archivado del original el 24 de junio de 2021. Consultado el 20 de junio de 2021 .
  97. "Tipos/Tipos construidos, parte de la documentación oficial de C#" . Microsoft Learn . Consultado el 7 de abril de 2024 .
  98. "Restricciones de parámetros de clases/tipos, parte de la documentación oficial de C#" . Microsoft Learn . 7 de febrero de 2024. Consultado el 7 de abril de 2024 .
  99. Zhang, Xue Dong; Teng, Zi Mu; Zhao, Dong Wang (septiembre de 2014). "Investigación de la tecnología de acceso a bases de datos bajo .NET Framework" . Applied Mechanics and Materials . 644–650 : 3077–3080 . doi : 10.4028/www.scientific.net/AMM.644-650.3077 . S2CID 62201466. ProQuest 1565579768 .  
  100. Otey, Michael (febrero de 2006). "LINQ al futuro". SQL Server Magazine . Vol. 8, n.º 2, págs. 17–21 . ProQuest 214859896 .    
  101. Sheldon, William (noviembre de 2010). "Nuevas características en LINQ". SQL Server Magazine . Vol. 12, n.º 11. págs. 37–40 . ProQuest 770609095 .    
  102. BillWagner (15 de septiembre de 2021). "Sintaxis de consultas y sintaxis de métodos en LINQ (C#)" . learn.microsoft.com . Archivado del original el 23 de mayo de 2023. Recuperado el 23 de mayo de 2023 .
  103. erikdietrich (9 de marzo de 2023). "La historia de C# - Guía de C#" . learn.microsoft.com . Archivado del original el 28 de abril de 2023. Consultado el 28 de abril de 2023 .
  104. El recorrido funcional de C# - Mads Torgersen - NDC Copenhague 2022 , 17 de agosto de 2022, archivado del original el 15 de mayo de 2023 , consultado el 15 de mayo de 2023
  105. "La belleza de los cierres" . csharpindepth.com . Archivado del original el 19 de mayo de 2023. Consultado el 28 de abril de 2023 .
  106. 1 2 BillWagner. "Funciones anónimas - Guía de programación en C#" . Microsoft Learn . Archivado del original el 15 de abril de 2021. Recuperado el 15 de mayo de 2021 .
  107. 1 2 3 "Novedades de C# 7.0" . Microsoft Docs . Archivado del original el 6 de agosto de 2020. Consultado el 14 de abril de 2019 .
  108. "C# 9.0 en los registros" . Blog de .NET . 10 de noviembre de 2020. Archivado del original el 15 de mayo de 2021. Consultado el 15 de mayo de 2021 .
  109. BillWagner (30 de junio de 2022). "Palabra clave init - Referencia de C#" . learn.microsoft.com . Archivado del original el 19 de mayo de 2023. Consultado el 19 de mayo de 2023 .
  110. Plataforma de compilación .NET , Plataforma .NET, 28 de abril de 2023, archivado del original el 28 de abril de 2023 , recuperado el 28 de abril de 2023
  111. 1 2 3 4 Archer 2001 .
  112. Lippert, Eric (19 de marzo de 2009). "Representación e identidad" . Fabulosas aventuras en la programación . Blogs.msdn.com. Archivado del original el 12 de julio de 2011. Recuperado el 4 de octubre de 2012 .
  113. "Bibliotecas de marcos de trabajo" . Microsoft Learn . 19 de abril de 2023. Archivado del original el 14 de julio de 2019. Consultado el 14 de julio de 2019 .
  114. BillWagner. "Novedades de C# 9.0 - Guía de C#" . Microsoft Learn . Archivado del original el 5 de septiembre de 2020. Consultado el 14 de mayo de 2021 .
  115. BillWagner. "Main() y argumentos de línea de comandos" . Microsoft Learn . Archivado del original el 5 de agosto de 2021. Consultado el 5 de agosto de 2021 .
  116. "Desbloqueando el poder de los genéricos de C#: una guía completa" . 24 de abril de 2024.
  117. "Compromiso de patentes para desarrolladores de código abierto" . 16 de marzo de 2023. Archivado del original el 7 de diciembre de 2017. Consultado el 28 de octubre de 2017 .
  118. "Acuerdo de cooperación en materia de patentes: colaboración de interoperabilidad entre Microsoft y Novell" . Microsoft . 2 de noviembre de 2006. Archivado del original el 17 de mayo de 2009. Recuperado el 5 de julio de 2009. Microsoft , en nombre propio y de sus subsidiarias (colectivamente "Microsoft"), se compromete a no demandar a los clientes de Novell ni a los clientes de las subsidiarias de Novell por infracción de patentes protegidas de Microsoft debido al uso por parte de dicho cliente de copias específicas de un producto protegido distribuido por Novell o sus subsidiarias (colectivamente "Novell") por las cuales Novell ha recibido ingresos (directa o indirectamente) por dichas copias específicas; siempre que el compromiso anterior se limite al uso por parte de dicho cliente (i) de dichas copias específicas que Novell autorice a cambio de dichos ingresos, y (ii) dentro del alcance autorizado por Novell a cambio de dichos ingresos.
  119. "Definiciones" . Microsoft . 2 de noviembre de 2006. Archivado del original el 4 de noviembre de 2012. Consultado el 5 de julio de 2009 .
  120. Steinman, Justin (7 de noviembre de 2006). "Novell responde preguntas de la comunidad" . Archivado del original el 16 de julio de 2013. Recuperado el 5 de julio de 2009. Sostenemos que Mono no infringe ninguna patente de Microsoft.
  121. "Pacto con los destinatarios posteriores de Moonlight: colaboración de interoperabilidad entre Microsoft y Novell" . Microsoft . 28 de septiembre de 2007. Archivado del original el 23 de septiembre de 2010. Consultado el 8 de marzo de 2008 ."Destinatario descendente" significa una entidad o individuo que utiliza para su propósito previsto una Implementación de Moonlight obtenida directamente de Novell o a través de un Destinatario intermedio... Microsoft se reserva el derecho de actualizar (incluida la interrupción) el pacto anterior... "Implementación de 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 están licenciadas bajo GPLv3 o una licencia similar.
  122. 1 2 "¡La transición a RyuJIT está completa!" . microsoft.com . 19 de junio de 2018. Archivado del original el 19 de julio de 2019. Recuperado el 20 de julio de 2021 .
  123. "Proceso de ejecución administrada" . microsoft.com . Archivado del original el 23 de diciembre de 2017. Consultado el 20 de julio de 2021 .
  124. "coreclr/src/jit/" . github.com . Archivado del original el 9 de enero de 2019 . Recuperado el 20 de julio de 2021 .
  125. "Guía de C#" . Microsoft Learn . Archivado del original el 13 de agosto de 2022. Consultado el 28 de julio de 2017 .
  126. "5.0.8" . microsoft.com . Archivado del original el 23 de abril de 2020 . Consultado el 20 de julio de 2021 .
  127. "Mitigación: Nuevo compilador JIT de 64 bits" . microsoft.com . Archivado del original el 5 de abril de 2018. Consultado el 20 de julio de 2021 .
  128. Etcheverry, Ignacio (21 de octubre de 2017). "Introducción a C# en Godot" . Godot Engine . Archivado del original el 26 de octubre de 2018. Recuperado el 26 de octubre de 2018 .

Fuentes

  • Albahari, Joseph (2022). C# 10 en pocas palabras (Primera  ed.). O'Reilly. ISBN 978-1-098-12195-2.
  • Archer, Tom (2001). «Parte 2, Capítulo 4: El sistema de tipos». Inside C# . Redmond, Washington: Microsoft Press. ISBN 0-7356-1288-9.
  • Novák, István; Velvart, András; Granicz, Adam; Balássy, György; Hajdrik, Atila; Vendedores, Mitchel; Hillar, Gastón C.; Molnár, Ágnes; Kanjilal, Joydip (2010). Visual Studio 2010 y .NET 4 seis en uno . Prensa Wrox. ISBN 978-0470499481.
  • Skeet, Jon (2019). C# en profundidad (Cuarta  ed.). Manning. ISBN 978-1617294532.

Lecturas adicionales

  • 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.
  • Especificación del lenguaje C#
  • Guía de programación en C#
  • Especificación del lenguaje ISO C#
  • Código fuente de la plataforma de compilación de C# ("Roslyn")
Obtenido de " https://en.wikipedia.org/w/index.php?title=C_Sharp_(programming_language)&oldid=1361634868#Implementations "