Articulo de referencia

C Sharp (lenguaje de programación)

C# ( / ˌ s iː ˈ ʃ ɑː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 prog...

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, [16] : 4  de tipado fuerte , de alcance léxico , imperativo , declarativo , funcional , genérico , [16] : 22  orientado a objetos ( basado en clases ) y orientado a componentes . [17]

Los principales inventores del lenguaje de programación C# fueron Anders Hejlsberg , Scott Wiltamuth y Peter Golde de Microsoft . [17] Se distribuyó ampliamente por primera vez en julio de 2000 [17] y luego 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 Visual Studio , ambos 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 software), todos ellos compatibles con C# y gratuitos, de código abierto y multiplataforma. Mono también se unió a Microsoft, pero no se fusionó con .NET.

A partir de noviembre de 2023, [actualizar]la versión estable más reciente del lenguaje es C# 12.0, que se lanzó en 2023 en .NET 8.0. [18] [19]

Objetivos de diseño

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

Historia

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). [22] [23] 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 ". [24] Microsoft había considerado mantener el nombre "Cool" como el nombre final del lenguaje, 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 entorno de ejecución de ASP.NET se habían portado 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 afirmado que las fallas [25] en la mayoría de los lenguajes de programación principales (por ejemplo, C++ , Java , Delphi y Smalltalk ) impulsaron los fundamentos de Common Language Runtime (CLR), que, a su vez, impulsó el diseño del lenguaje C#.

James Gosling , que 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 sin confiabilidad, productividad ni seguridad". [26] [27] 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. [28]

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 desviaciones se produjo con la incorporació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 utilizar como cualquier otra clase, con generación de código realizada en el momento de la carga de la clase. [29] Además, C# ha añadido varias características importantes para dar cabida a la programación de estilo funcional, que culminaron en las extensiones LINQ publicadas con C# 3.0 y su marco de apoyo de expresiones lambda , métodos de extensión y tipos anónimos . [30] Estas características permiten a los programadores de C# utilizar técnicas de programación funcional, como cierres , cuando sea 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, desplazando el énfasis hacia la lógica real del programa para ayudar a mejorar la legibilidad y el mantenimiento. [31]

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

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

Nombre

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

Nota musical do sostenido

El nombre "C sostenido" se inspiró en la notación musical, según la cual un símbolo sostenido indica que la nota escrita debe ser un semitono más alta en tono . [38] 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 sostenido 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++. [39]

Debido a los límites técnicos de visualización (fuentes estándar, navegadores, etc.) y a que la mayoría de los diseños de teclado carecen de un símbolo de sostenido ( U+266F SIGNO DE SOSTÉN MUSICAL ( )), se eligió el signo de número ( U+0023 # SIGNO DE NÚMERO ( # )) para aproximarse al símbolo de sostenido en el nombre escrito del lenguaje de programación. [40] Esta convención se refleja en la Especificación del lenguaje C# ECMA-334. [17]

El sufijo "sharp" ha sido utilizado por varios otros lenguajes .NET que son variantes de lenguajes existentes, incluyendo 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# . [41] La implementación original de Eiffel para .NET se llamaba Eiffel#, [42] 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

Sintaxis

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

  • Los puntos y comas se utilizan para indicar el final de una declaración.
  • Las llaves se utilizan para agrupar declaraciones. Las declaraciones se suelen agrupar en métodos (funciones), los métodos en clases y las clases en espacios de nombres .
  • Las variables se asignan utilizando un signo igual , pero se comparan utilizando 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.

Rasgos distintivos

Algunas características notables de C# que lo distinguen de C, C++ y Java, donde se indique, 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. [68] 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# deba apuntar a un entorno de ejecución de lenguaje común (Common Language Runtime), o generar lenguaje intermedio común (Common Intermediate Language, CIL), o generar cualquier otro formato específico. Algunos compiladores de C# también pueden generar código de máquina como los compiladores tradicionales de C++ o Fortran . [69] [70]

Mecanografía

C# admite declaraciones de variables fuertemente tipadas de forma implícita con la palabra clave var, [16] : 470  y matrices tipadas de forma implícita con la palabra clave new[]seguida de un inicializador de colección. [16] : 80  [20] : 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 entregan automáticamente como copias cuando se usan como parámetros, y tipos de referencia, que incluyen matrices, instancias de clases y cadenas, que solo entregan un puntero al objeto respectivo. Debido a su manejo especial del operador de igualdad, las cadenas se comportarán, no obstante, como si fueran valores, para todos los fines prácticos. Incluso puede usarlas como etiquetas de caso . Cuando sea necesario, los tipos de valor se encuadrarán automáticamente . [71]

C# admite un tipo de datos booleano estricto , bool. Las declaraciones que aceptan condiciones, como whiley if, requieren una expresión de un tipo que implemente el trueoperador, como el tipo booleano. Si bien C++ también tiene un tipo booleano, se puede convertir libremente a y desde números enteros, y expresiones como if (a)requieren solo 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 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 en cuanto a tipos que C++. Las únicas conversiones implícitas por defecto son aquellas que se consideran seguras, como la ampliación 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 números enteros, ni entre miembros de enumeración y números enteros (excepto 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 ambos implícitos por defecto.

C# tiene soporte explícito para covarianza y contravarianza en tipos genéricos, [16] : 144  [20] : 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 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 las clases públicas pueden sustituir a las variables y funciones globales.

Las variables locales no pueden hacer sombra a las variables del bloque que las contiene, a diferencia de C y C++.

Metaprogramación

La metaprogramación se puede lograr de varias maneras:

  • La reflexión está respaldada por las API de .NET, que habilitan escenarios como la inspección de metadatos de tipo y la invocación de métodos dinámicos.
  • Los árboles de expresión [72] representan el código como un árbol de sintaxis abstracta , donde cada nodo es una expresión que se puede inspeccionar o ejecutar. Esto permite la modificación dinámica del código ejecutable en tiempo de ejecución. Los árboles de expresión introducen cierta homoiconicidad en el lenguaje.
  • Los atributos son metadatos que se pueden adjuntar a tipos, miembros o conjuntos completos , equivalentes a las anotaciones en Java . Los atributos son accesibles tanto para el compilador como para el código a través de la reflexión. Muchos de los atributos nativos duplican la funcionalidad de las directivas de preprocesador dependientes de la plataforma de GCC y VisualC++. [ cita requerida ]
  • System.Reflection.Emitespacio de nombres, [73] que contiene clases que emiten metadatos y CIL (tipos, ensamblajes, etc.) en tiempo de ejecución .
  • La plataforma de compilación .NET (Roslyn) proporciona acceso API a servicios de compilación de lenguajes, lo que permite la compilación de código C# desde dentro de aplicaciones .NET. Expone API para análisis sintáctico ( léxico ) de código, análisis semántico , compilación dinámica a CIL y emisión de código. [74]
  • Los generadores de código fuente, [75] una característica del compilador C# de Roslyn, 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 (una secuencia de instrucciones), en lugar de la mera capacidad de retención de valor de un campo (es decir, una variable de clase o instancia ). [76] 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 voidsi 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 compuesta por el tipo de un parámetro, su nombre formal y, opcionalmente, un valor predeterminado que se utilizará siempre que no se proporcione ninguno. A diferencia de la mayoría de los otros lenguajes, los parámetros de llamada por referencia tienen que estar marcados tanto en la definición de la función como en el sitio de llamada, y puede elegir entre refy out, este último permite entregar una variable no inicializada que tendrá un valor definido al regresar. [77] Además, puede especificar una lista de argumentos de tamaño variable aplicando la paramspalabra clave al último parámetro. [78] Ciertos tipos específicos de métodos, como aquellos que simplemente obtienen o establecen el valor de un campo al devolverlo o asignarlo, no requieren una firma completa explícitamente establecida, pero en el caso general, la definición de una clase incluye la declaración de firma completa de sus métodos. [79]

Al igual que en C++, y a diferencia de Java, los programadores de C# deben usar la palabra clave modificadora de ámbito virtualpara permitir que las subclases sobrescriban los métodos . A diferencia de C++, hay que especificar explícitamente la palabra clave overrideal hacerlo. [80] Se supone que esto evita la confusión entre sobreescribir y sobrecargar una función (es decir, ocultar la implementación anterior). Para hacer esto último, hay que especificar la newpalabra clave. [81]

Los métodos de extensión en C# permiten a los programadores utilizar 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 virtualmente métodos de instancia a una clase que consideran que deberían existir en ese tipo de objetos (e instancias de las respectivas clases derivadas). [16] : 103–105  [20] : 202–203 

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

C# admite punteros de función fuertemente tipados mediante la palabra clave . Al igual que la señal y la ranuradelegate pseudo-C++ del marco Qt , C# tiene una semántica que rodea específicamente a los eventos de estilo publicación-suscripción, aunque C# usa delegados para hacerlo.

C# ofrece llamadas a métodos similares a Java synchronized, 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 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 hay un definidor. Al igual que con los campos, puede haber propiedades de clase y de instancia. Los métodos subyacentes pueden ser virtualo abstractcomo cualquier otro método. [79]

Desde C# 3.0 está disponible el azúcar sintáctico de las propiedades implementadas automáticamente, [82] donde el descriptor de acceso (getter) y el mutador (setter) encapsulan operaciones en un solo atributo de una clase.

Espacio 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". [83]

Acceso a la memoria

En C#, los punteros a direcciones de memoria solo se pueden usar dentro de bloques específicamente marcados como inseguros , [84] y los programas con código inseguro necesitan permisos apropiados para ejecutarse. La mayoría de los accesos a objetos se realizan a través de referencias a objetos seguros, que siempre apuntan a un objeto "activo" o tienen el valor null bien definido ; es imposible obtener una referencia a un objeto "muerto" (uno que ha sido recolectado como basura), o a un bloque aleatorio de memoria. Un puntero inseguro puede apuntar a una instancia de un tipo de valor no administrado que no contenga ninguna referencia a objetos sujetos a recolecciones de basura como instancias de clase, 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, sino que se recolecta automáticamente. 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 retiene referencias a objetos por más tiempo del necesario puede experimentar un uso de memoria mayor al necesario; sin embargo, una vez que se libera la referencia final a un objeto, la memoria está disponible para la recolección de basura.

Excepciones

Los programadores tienen a su disposición una serie de excepciones estándar. Los métodos de las bibliotecas estándar lanzan con regularidad excepciones del sistema en determinadas circunstancias y normalmente se documenta la variedad de excepciones lanzadas. Se pueden definir clases de excepción personalizadas para las clases que permitan implementar el manejo en circunstancias particulares según sea necesario. [85]

La sintaxis para manejar excepciones es try { algo } catch (Exception ex) { manejar ex } finally { hacer algo ya sea que haya ocurrido o no una excepción } . Dependiendo de sus planes, la parte "catch" o "finally" se puede omitir, y puede haber varias partes "catch" que manejen diferentes tipos de excepciones. [86]

Las excepciones comprobadas no están presentes en C# (a diferencia de Java). Esta ha sido una decisión consciente basada en cuestiones de escalabilidad y versionabilidad. [87]

Polimorfismo

A diferencia de C++ , C# no admite la herencia múltiple , aunque una clase puede implementar cualquier cantidad 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 interfaz de línea de comandos.

Al implementar múltiples interfaces que contienen un método con el mismo nombre y toman parámetros del mismo tipo en el mismo orden (es decir, la misma firma ), de manera 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.

Sin embargo, a diferencia de Java, C# admite la sobrecarga de operadores . [88]

C# también ofrece sobrecarga de funciones (también conocido como polimorfismo ad hoc). [89]

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

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<T>interfaz esté implementada en el objeto. Esto incluye documentos XML, un conjunto de datos ADO.NET y bases de datos SQL. [92]

+ El uso de LINQ en C# trae ventajas como soporte de IntelliSense , fuertes capacidades de filtrado, seguridad de tipos con capacidad de verificación de errores de compilación y consistencia para consultar datos en una variedad de fuentes. [93] 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. [94]

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

utilizando System.Linq ; 

var números = 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 C# es principalmente un lenguaje imperativo, siempre agrega características funcionales con el tiempo, [96] [97] por ejemplo:

Sistema de tipos comunes

C# tiene un sistema de tipos unificado . Este sistema de tipos unificado se denomina Sistema de tipos común (CTS). [104] : Parte 2, Capítulo 4: El sistema de tipos 

Un sistema de tipos unificado implica que todos los tipos, incluidos los primitivos como los números 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: [104]

  1. Tipos de referencia
  2. Tipos de valores

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 se pueden derivar entre sí (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 en el valor predeterminado dependiente del tipo (0, nulo 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) 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.ValueTypeintfloatchardecimalSystem.DateTimeenumstruct

Por el contrario, 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 todas las demás instancias, 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, los tipos de referencia específicos pueden proporcionar dichos servicios al exponer un constructor público o implementar una interfaz correspondiente (como o ). Algunos 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 todas las matrices de C#). System.StringICloneableIComparableobjectSystem.StringSystem.Array

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

Empaquetado y desempaquetado

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

El desempaquetado es la operación de convertir un valor de un tipo de referencia (previamente encajonado) en un valor de un tipo de valor. [104] El desempaquetado en C# requiere una conversión de tipo explícita . Un objeto encajonado de tipo T solo se puede desempaquetar en un T (o un T que admita valores nulos). [105]

Ejemplo:

int foo = 42 ; // Tipo de valor. object bar = foo ; // foo se convierte en bar. int foo2 = ( int ) bar ; // Se desempaqueta nuevamente al 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 utiliza 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 CLI estándar, existen muchas bibliotecas de clases comerciales y comunitarias que se basan en las bibliotecas del marco .NET para proporcionar funcionalidad adicional. [106]

C# puede realizar llamadas a cualquier biblioteca incluida en la Lista de bibliotecas y marcos .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 declaraciones de nivel superior introducida en C# 9: [107]

usando Sistema ; 

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

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

usando 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 Sistema ; 

La línea anterior importa todos los tipos en el Systemespacio de nombres. Por ejemplo, la Consoleclase que se utiliza más adelante en el código fuente se define en el Systemespacio de nombres, lo que significa que se puede utilizar sin proporcionar 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 clase 

Arriba hay una definición de claseProgram para la clase. Todo lo que sigue entre las llaves describe esa 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.

void estático principal ()  

Esto declara el método miembro de la clase donde el programa comienza la ejecución. 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 dice al compilador que el método puede ser llamado desde cualquier lugar por cualquier clase. [108] 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 . (Sin embargo, tenga en cuenta que se pueden escribir programas cortos utilizando declaraciones de nivel superior introducidas en C# 9, como se mencionó anteriormente). static void Main(string[] args)private static void Main(string[] args)ProgramMainstaticProgramstatic MainvoidMain

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 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!".

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 tuvieron que usar colecciones como ArrayList para almacenar elementos como objetos de tipo no especificado, lo que generó una sobrecarga de rendimiento al empaquetar, desempaquetar y verificar el tipo de los elementos contenidos.

Los genéricos introdujeron una característica nueva y masiva en .NET que permitió a los desarrolladores crear estructuras de datos con seguridad de tipos. 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 capacidad de mantenimiento al reemplazar estructuras de datos obsoletas con alternativas más eficientes y con seguridad de tipos. [109]

Ejemplo

clase pública DataStore < T > { privada T [] elementos = nueva T [ 10 ]; privada int recuento = 0 ;  

         
        

    public void Add ( T elemento ) { elementos [ count ++ ] = elemento ; }   
    
          
    

    público T Obtener ( int índice ) { devolver elementos [ índice ]; } }   
    
         
    

Normalización y licencias

En agosto de 2001, Microsoft , Hewlett-Packard e Intel copatrocinaron la presentación de especificaciones para C# así como para 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 había adoptado previamente especificaciones equivalentes como la 2.ª 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 nulos y genéricos (algo similares a las plantillas de C++ ). En julio de 2005, ECMA presentó a ISO/IEC JTC 1/SC 22, a través del proceso Fast-Track de este último, los estándares y los TR relacionados. Este proceso suele tardar entre 6 y 9 meses.

La definición del lenguaje C# y la CLI están estandarizadas según los estándares ISO / IEC y Ecma que brindan protección de licencia razonable y no discriminatoria frente a reclamos 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 . [110] Microsoft también acordó no hacer cumplir las patentes relacionadas con los productos de Novell contra los clientes que pagan de Novell [111] con la excepción de una lista de productos que no mencionan explícitamente C#, .NET o la implementación de .NET de Novell ( el Proyecto Mono ). [112] Sin embargo, Novell sostuvo que Mono no infringe ninguna patente de Microsoft. [113] Microsoft también hizo 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. [114]

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

Implementaciones

Microsoft lidera el desarrollo de compiladores de referencia de código abierto para C# y un conjunto de herramientas. El primer compilador, Roslyn , compila en lenguaje intermedio (IL), y el segundo, RyuJIT, [115] es un compilador JIT (justo a tiempo), 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. [116] RyuJIT es de código abierto y está escrito en C++. [117] Roslyn está escrito completamente en código administrado (C#), se ha abierto y la funcionalidad ha surgido como API. Por lo tanto, permite a los desarrolladores crear herramientas de refactorización y diagnóstico. [4] [118] Dos ramas de la 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. [119] En .NET Framework 4.6, un nuevo compilador JIT reemplazó al anterior. [115] [120]

Otros compiladores de C# (algunos de los cuales incluyen una implementación de Common Language Infrastructure y 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 marco necesarias tal como aparecen en la especificación ECMA) y una implementación casi completa de las bibliotecas de clase NET hasta .NET Framework 3.5.
  • La cadena de herramientas Elements de RemObjects incluye RemObjects C#, que compila código C# en lenguaje intermedio común de .NET , código de bytes de Java , Cocoa , código de bytes de Android , WebAssembly y código de máquina nativo para Windows, macOS y Linux.
  • El proyecto DotGNU (ahora discontinuado) también proporcionó un compilador C# de código abierto, una implementación casi completa de la Infraestructura de Lenguaje Común incluyendo las bibliotecas de marco requeridas tal como aparecen en la especificación ECMA, y un subconjunto de algunas de las bibliotecas de clase .NET restantes propiedad de Microsoft hasta .NET 2.0 (aquellas no documentadas o incluidas en la especificación ECMA, pero incluidas en la distribución .NET Framework estándar de Microsoft).

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

Véase también

Notas

  1. ^ para asíncrono
  2. ^ Por convención, en un texto normal se utiliza un signo de número para el segundo carácter; en representaciones artísticas, a veces se utiliza un verdadero signo de sostenido : C♯. Sin embargo, el estándar ECMA 334 establece: "El nombre C# se escribe como la LETRA MAYÚSCULA LATINA C (U+0043) seguida del SIGNO DE NÚMERO # (U+0023)".
  3. ^ Las versiones de idioma 1.0, 2.0 y 5.0 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 especificaciones de Microsoft C# 2.0 solo contiene las nuevas características de la versión 2.0. Para las características anteriores, utilice la especificación 1.2 mencionada anteriormente.

Referencias

Citas

  1. ^ "InfoQ eMag: una vista previa de C# 7". Archivado desde el original el 24 de abril de 2023. Consultado el 11 de noviembre de 2016 .
  2. ^ "Anuncio de C# 12" . Consultado el 18 de noviembre de 2023 .
  3. ^ Torgersen, Mads (27 de octubre de 2008). «Nuevas características de C# 4.0». Microsoft . Archivado desde el original el 3 de enero de 2012 . Consultado el 28 de octubre de 2008 .
  4. ^ ab «El compilador Roslyn .NET proporciona a los lenguajes C# y Visual Basic APIs de análisis de código enriquecidas.: dotnet/roslyn». 13 de noviembre de 2019. Archivado desde el original el 22 de febrero de 2021. Consultado el 13 de febrero de 2015 – vía GitHub.
  5. ^ "CoreCLR es el entorno de ejecución de .NET Core. Incluye el recolector de elementos no utilizados, el compilador JIT, los tipos de datos primitivos y las clases de bajo nivel.: dotnet/coreclr". 13 de noviembre de 2019. Archivado desde el original el 14 de octubre de 2019. Consultado el 8 de marzo de 2017 – vía GitHub.
  6. ^ ab 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 es mejor verlo como un descendiente tanto de C++ como de Java.
  7. ^ Hamilton, Naomi (1 de octubre de 2008). "La A de los lenguajes de programación: C#". Computerworld . Archivado desde el original el 24 de marzo de 2010 . Consultado el 12 de febrero de 2010 . Todos nos apoyamos en los hombros de gigantes y cada lenguaje se basa en lo que lo precedió, por lo que le debemos mucho a C, C++, Java, Delphi y todas esas otras cosas que nos precedieron. ( Anders Hejlsberg )
  8. ^ "Especificación de la capilla (Agradecimientos)" (PDF) . Cray Inc. 1 de octubre de 2015. Archivado desde el original (PDF) el 5 de febrero de 2016 . Consultado el 14 de enero de 2016 .
  9. ^ "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 .
  10. ^ Borenszweig, Ary (14 de junio de 2016). "¡Se lanzó Crystal 0.18.0!". Archivado desde el original el 25 de diciembre de 2018. Consultado el 7 de agosto de 2017. Está fuertemente inspirado en Ruby y otros lenguajes (como C#, Go y Python).
  11. ^ "Lenguajes web y máquinas virtuales: el código rápido siempre está de moda (V8, Dart) - Google I/O 2013". YouTube . Archivado desde el original el 21 de diciembre de 2021 . Consultado el 22 de diciembre de 2013 .
  12. ^ Java 5.0 agregó varias características nuevas del lenguaje (el bucle for mejorado , autoboxing , varargs y anotaciones ), después de que se introdujeran en el lenguaje similar (y competidor) C# [1] Archivado el 19 de marzo de 2011 en Wayback Machine [2] Archivado el 7 de enero de 2006 en Wayback Machine
  13. ^ Cornelius, Barry (1 de diciembre de 2005). "Java 5 alcanza a C#". Servicios informáticos de la Universidad de Oxford . Archivado desde el original el 6 de marzo de 2023. 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)
  14. ^ "Influencias - La referencia de Rust". La referencia de Rust . Archivado desde el original el 26 de enero de 2019. Consultado el 18 de abril de 2023 .
  15. ^ Lattner, Chris (3 de junio de 2014). "Página de inicio de Chris Lattner". Chris Lattner. Archivado del original el 25 de diciembre de 2018. Consultado el 12 de mayo de 2020. El lenguaje Swift es el 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 de pruebas internas 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, tomando ideas de Objective-C, Rust, Haskell, Ruby, Python, C#, CLU y muchos otros para enumerarlos.
  16. ^ abcdefg Tiro al plato 2019.
  17. ^ abcde C# Language Specification (PDF) (4.ª ed.). Ecma International . Junio ​​de 2006. Archivado (PDF) desde el original el 21 de abril de 2021. Consultado el 26 de enero de 2012 .
  18. ^ Dollard, Kathleen (14 de noviembre de 2023). "Anuncio de C# 12". Blog de .NET . Archivado desde el original el 18 de noviembre de 2023. Consultado el 18 de noviembre de 2023 .
  19. ^ Seth, Gaurav (14 de noviembre de 2023). "Anuncio de .NET 8". Blog de .NET . Archivado desde el original el 19 de noviembre de 2023. Consultado el 18 de noviembre de 2023 .
  20. ^abcdef Albahaca 2022.
  21. ^ "Objetivos de diseño de C#". www.java-samples.com . Archivado desde el original el 6 de octubre de 2021 . Consultado el 6 de octubre de 2021 .
  22. ^ Zander, Jason (22 de noviembre de 2007). «Un par de hechos históricos». Archivado desde el original el 29 de julio de 2020. Consultado el 23 de febrero de 2009 .
  23. ^ "¿En qué lenguaje se escribió originalmente ASP.Net?". 28 de noviembre de 2006. Archivado desde el original el 24 de junio de 2016. Consultado el 21 de febrero de 2008 .
  24. ^ Hamilton, Naomi (1 de octubre de 2008). "Lenguajes de programación de la A a la Z: C#". Computerworld . Archivado desde el original el 18 de mayo de 2019 . Consultado el 1 de octubre de 2008 .
  25. ^ "Detalles". nilsnaegele.com . Archivado desde el original el 7 de abril de 2019 . Consultado el 7 de abril de 2019 .
  26. ^ "Por qué C# de Microsoft no lo es". CNET: CBS Interactive. 2002. Archivado desde el original el 14 de agosto de 2023. Consultado el 18 de septiembre de 2023 .
  27. ^ Bill Joy (7 de febrero de 2002). «El punto ciego de Microsoft». cnet.com. Archivado desde el original el 14 de agosto de 2023. Consultado el 18 de septiembre de 2023 .
  28. ^ Osborn, John (1 de agosto de 2000). "Deep Inside C#: An Interview with Microsoft Chief Architect Anders Hejlsberg". O'Reilly Media. Archivado desde el original el 9 de enero de 2010. Consultado el 14 de noviembre de 2009 .
  29. ^ "Generics (C# Programming Guide)" (Elementos genéricos (Guía de programación de C#)). Microsoft. Archivado desde el original el 26 de agosto de 2011. Consultado el 21 de marzo de 2011 .
  30. ^ Don Box y Anders Hejlsberg (febrero de 2007). "LINQ: .NET Language-Integrated Query". Microsoft. Archivado desde el original el 24 de agosto de 2011. Consultado el 21 de marzo de 2011 .
  31. ^ 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 desde el original el 11 de julio de 2011. Consultado el 21 de marzo de 2011 .
  32. ^ "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 .
  33. ^ "Comités técnicos - JTC 1/SC 22 - Lenguajes de programación, sus entornos e interfaces de software de sistema". ISO. Archivado desde el original el 27 de septiembre de 2012. Consultado el 4 de octubre de 2012 .
  34. ^ "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 .
  35. ^ "ISO/IEC 23270:2006 - Tecnología de la información - Lenguajes de programación - C#". Iso.org. 26 de enero de 2012. Archivado desde el original el 6 de diciembre de 2010. Consultado el 4 de octubre de 2012 .
  36. ^ "SO/IEC 23270:2018 Tecnología de la información — Lenguajes de programación — C#". ISO . Consultado el 26 de noviembre de 2020 .
  37. ^ Mariani, Rico (5 de octubre de 2009). "Mi historia de Visual Studio (Parte 1) – Rico Mariani's Performance Tidbits". Rico Mariani's Performance Tidbits . Archivado desde el original el 27 de mayo de 2018. Consultado el 26 de mayo de 2018 .
  38. ^ Kovacs, James (7 de septiembre de 2007). "Lección de historia de C#/.NET". Archivado desde el original el 6 de marzo de 2009 . Consultado el 18 de junio de 2009 .
  39. ^ Hejlsberg, Anders (1 de octubre de 2008). "The AZ of Programming Languages: C#". Computerworld . Archivado desde el original el 2 de abril de 2015. Consultado el 22 de junio de 2014 .
  40. ^ "Preguntas frecuentes sobre Microsoft C#". Microsoft . Archivado desde el original el 14 de febrero de 2006 . Consultado el 25 de marzo de 2008 .
  41. ^ "Preguntas frecuentes sobre F#". Microsoft Research. Archivado desde el original el 18 de febrero de 2009. Consultado el 18 de junio de 2009 .
  42. ^ Simon, Raphael; Stapf, Emmanuel; Meyer, Bertrand (junio de 2002). «Full Eiffel on the .NET Framework». Microsoft . Archivado desde el original el 21 de julio de 2009. Consultado el 18 de junio de 2009 .
  43. ^ "Novedades en el lenguaje y compilador de C# 2.0". Microsoft. Archivado desde el original el 18 de diciembre de 2010. Consultado el 11 de junio de 2014 .
  44. ^ Hejlsberg, Anders; Torgersen, Mads (30 de abril de 2007). «Descripción general de C# 3.0». Microsoft Developer Network . Microsoft. Archivado desde el original el 25 de junio de 2014. Consultado el 11 de junio de 2014 .
  45. ^ ab "Uso de C# 3.0 desde .NET 2.0". Danielmoth.com. 13 de mayo de 2007. Archivado desde el original el 29 de septiembre de 2012. Consultado el 4 de octubre de 2012 .
  46. ^ Hejlsberg, Anders (15 de septiembre de 2011). "Future directions for C# and Visual Basic". Canal 9. BUILD2011. Microsoft. Archivado desde el original el 23 de septiembre de 2011. Consultado el 21 de septiembre de 2011 .
  47. ^ "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 desde el original el 4 de junio de 2014. Consultado el 11 de junio de 2014 .
  48. ^ "Características de los lenguajes en C# 6 y VB 14". GitHub . dotnet/roslyn. Archivado desde el original el 12 de enero de 2016 . Consultado el 13 de febrero de 2015 .
  49. ^ "Novedades de C# 7". Microsoft Docs . 21 de diciembre de 2016. Archivado desde el original el 1 de noviembre de 2017.
  50. ^ Torgersen, Mads (9 de marzo de 2017). "Nuevas características en C# 7.0". Blog de .NET . Microsoft. Archivado desde el original el 11 de abril de 2017. Consultado el 9 de junio de 2017 .
  51. ^ "Notas de la versión 15.0 de Visual Studio 2017". Microsoft Learn . 11 de abril de 2023. Archivado desde el original el 20 de abril de 2023 . Consultado el 19 de abril de 2023 .
  52. ^ "Novedades de C# 7.1". Microsoft Docs . Archivado desde el original el 10 de octubre de 2017. Consultado el 9 de octubre de 2017 .
  53. ^ "Notas de la versión 15.3 de Visual Studio 2017". Microsoft Learn . 11 de abril de 2023. Archivado desde el original el 21 de marzo de 2023 . Consultado el 19 de abril de 2023 .
  54. ^ "Novedades de C# 7.2". Microsoft Docs . Archivado desde el original el 1 de diciembre de 2017. Consultado el 26 de noviembre de 2017 .
  55. ^ "Notas de la versión 15.5 de Visual Studio 2017". Microsoft Learn . 11 de abril de 2023. Archivado desde el original el 20 de abril de 2023 . Consultado el 19 de abril de 2023 .
  56. ^ "Novedades de C# 7.3". Microsoft Docs . Archivado desde el original el 23 de junio de 2018. Consultado el 23 de junio de 2018 .
  57. ^ "Notas de la versión 15.7 de Visual Studio 2017". Microsoft Learn . 13 de julio de 2022. Archivado desde el original el 20 de abril de 2023 . Consultado el 19 de abril de 2023 .
  58. ^ "Novedades de C# 8.0". Microsoft Docs . 9 de marzo de 2023. Archivado desde el original el 6 de septiembre de 2020 . Consultado el 14 de abril de 2019 .
  59. ^ "Notas de la versión 16.3 de Visual Studio 2019". Microsoft Learn . 11 de abril de 2023. Archivado desde el original el 20 de abril de 2023 . Consultado el 19 de abril de 2023 .
  60. ^ BillWagner. "Novedades de C# 9.0: guía de C#". Microsoft Learn . Archivado desde el original el 5 de septiembre de 2020. Consultado el 15 de octubre de 2020 .
  61. ^ "Notas de la versión 16.8 de Visual Studio 2019". Microsoft Learn . 11 de abril de 2023. Archivado desde el original el 20 de abril de 2023 . Consultado el 19 de abril de 2023 .
  62. ^ "Novedades de C# 10". Microsoft Learn . Archivado desde el original el 8 de febrero de 2022 . Consultado el 10 de noviembre de 2021 .
  63. ^ "Notas de la versión 17.0 de Visual Studio 2022". Microsoft Learn . Archivado desde el original el 16 de julio de 2023 . Consultado el 19 de abril de 2023 .
  64. ^ "Novedades de C# 11". Microsoft Learn . Archivado desde el original el 15 de agosto de 2022 . Consultado el 8 de agosto de 2022 .
  65. ^ "Notas de la versión 17.4 de Visual Studio 2022". Microsoft Learn . Archivado desde el original el 6 de agosto de 2023 . Consultado el 19 de abril de 2023 .
  66. ^ "Novedades de C# 12". Microsoft Learn . Archivado desde el original el 20 de julio de 2023 . Consultado el 29 de junio de 2023 .
  67. ^ "Notas de la versión 17.6 de Visual Studio 2022". Microsoft Learn . Archivado desde el original el 6 de agosto de 2023 . Consultado el 29 de junio de 2023 .
  68. ^ Novák y otros 2010.
  69. ^ stevewhims; mattwojo (20 de octubre de 2022). "Compiling Apps with .NET Native - UWP applications" (Compilación de aplicaciones con .NET Native: aplicaciones para UWP). learn.microsoft.com . Archivado desde el original el 27 de octubre de 2023. Consultado el 27 de octubre de 2023 .
  70. ^ LakshanF; agocke; Rick-Anderson; et al. (12 de septiembre de 2023). «Descripción general de la implementación de AOT nativo - .NET». learn.microsoft.com . Archivado desde el original el 11 de noviembre de 2023 . Consultado el 27 de octubre de 2023 .{{cite web}}: CS1 maint: nombres numéricos: lista de autores ( enlace )
  71. ^ "Tipos/General, parte de la documentación oficial de C#". Microsoft . Archivado desde el original el 29 de marzo de 2024 . Consultado el 6 de abril de 2024 .
  72. ^ Bill Wagner. «Árboles de expresión (C#)». Microsoft Learn . Archivado desde el original el 15 de mayo de 2021. Consultado el 14 de mayo de 2021 .
  73. ^ dotnet-bot. «Espacio de nombres System.Reflection.Emit». learn.microsoft.com . Archivado desde el original el 28 de abril de 2023. Consultado el 28 de abril de 2023 .
  74. ^ McAllister, Neil (20 de octubre de 2011). «Roslyn de Microsoft: reinventando el compilador tal como lo conocemos». InfoWorld . Archivado desde el original el 5 de marzo de 2022. Consultado el 5 de marzo de 2022 .
  75. ^ "Introducción a los generadores de código fuente de C#". Blog de .NET . 29 de abril de 2020. Archivado desde el original el 7 de mayo de 2021 . Consultado el 14 de mayo de 2021 .
  76. ^ "Clases/campos, parte de la documentación oficial de C#".
  77. ^ "fuera (Referencia de C#)".
  78. ^ "Parámetros del método/modificador params, parte de la documentación oficial de C#".
  79. ^ ab "Clases/propiedades, parte de la documentación oficial de C#".
  80. ^ "virtual (C# Reference)". Microsoft Learn . 15 de septiembre de 2021. Archivado desde el original el 30 de agosto de 2018 . Consultado el 4 de abril de 2018 .
  81. ^ "nuevo modificador, parte de la documentación oficial de C#".
  82. ^ "Propiedades implementadas automáticamente (Guía de programación de C#)". Archivado desde el original el 29 de octubre de 2020 . Consultado el 12 de septiembre de 2020 .
  83. ^ "Directiva using - Referencia de C#". Microsoft Docs . Archivado desde el original el 14 de abril de 2019 . Consultado el 14 de abril de 2019 .
  84. ^ Bill Wagner. «Código inseguro, punteros a datos y punteros a funciones». Microsoft Learn . Archivado desde el original el 4 de julio de 2021. Consultado el 20 de junio de 2021 .
  85. ^ "Cómo crear excepciones definidas por el usuario". Archivado desde el original el 26 de enero de 2021 . Consultado el 12 de septiembre de 2020 .
  86. ^ "Declaraciones de manejo de excepciones, parte de la documentación oficial de C#". Microsoft Learn . Consultado el 26 de junio de 2024 .
  87. ^ Venners, Bill; Eckel, Bruce (18 de agosto de 2003). "El problema con las excepciones comprobadas". Archivado desde el original el 18 de febrero de 2015. Consultado el 30 de marzo de 2010 .
  88. ^ BillWagner. "Sobrecarga de operadores: referencia de C#". Microsoft Learn . Archivado desde el original el 24 de junio de 2021 . Consultado el 20 de junio de 2021 .
  89. ^ "Expresiones/Resolución de sobrecarga, parte de la documentación oficial de C#". Microsoft Learn . Consultado el 7 de abril de 2024 .
  90. ^ "Tipos/Tipos construidos, parte de la documentación oficial de C#". Microsoft Learn . Consultado el 7 de abril de 2024 .
  91. ^ "Clases/Restricciones de parámetros de tipo, parte de la documentación oficial de C#". Microsoft Learn . Consultado el 7 de abril de 2024 .
  92. ^ Zhang, Xue Dong; Teng, Zi Mu; Zhao, Dong Wang (septiembre de 2014). "Investigación de la tecnología de acceso a bases de datos en el marco .NET". Applied Mechanics and Materials . 644–650: 3077–3080. doi :10.4028/www.scientific.net/AMM.644-650.3077. S2CID  62201466. ProQuest  1565579768.
  93. ^ Otey, Michael (febrero de 2006). "LINQ to the Future". SQL Server Magazine . Vol. 8, núm. 2. págs. 17–21. ProQuest  214859896.
  94. ^ Sheldon, William (noviembre de 2010). "Nuevas características en LINQ". SQL Server Magazine . Vol. 12, núm. 11. págs. 37–40. ProQuest  770609095.
  95. ^ BillWagner (15 de septiembre de 2021). "Sintaxis de consulta y sintaxis de método en LINQ (C#)". learn.microsoft.com . Archivado desde el original el 23 de mayo de 2023 . Consultado el 23 de mayo de 2023 .
  96. ^ erikdietrich (9 de marzo de 2023). «La historia de C# - Guía de C#». learn.microsoft.com . Archivado desde el original el 28 de abril de 2023 . Consultado el 28 de abril de 2023 .
  97. ^ El viaje funcional de C# - Mads Torgersen - NDC Copenhagen 2022, archivado del original el 15 de mayo de 2023 , consultado el 15 de mayo de 2023
  98. ^ "La belleza de los cierres". csharpindepth.com . Archivado desde el original el 19 de mayo de 2023 . Consultado el 28 de abril de 2023 .
  99. ^ por BillWagner. "Funciones anónimas - Guía de programación de C#". Microsoft Learn . Archivado desde el original el 15 de abril de 2021 . Consultado el 15 de mayo de 2021 .
  100. ^ abc "Novedades de C# 7.0". Microsoft Docs . Archivado desde el original el 6 de agosto de 2020. Consultado el 14 de abril de 2019 .
  101. ^ "C# 9.0 en el registro". Blog de .NET . 10 de noviembre de 2020. Archivado desde el original el 15 de mayo de 2021 . Consultado el 15 de mayo de 2021 .
  102. ^ BillWagner (30 de junio de 2022). «Palabra clave init - Referencia de C#». learn.microsoft.com . Archivado desde el original el 19 de mayo de 2023 . Consultado el 19 de mayo de 2023 .
  103. ^ The .NET Compiler Platform, .NET Platform, 28 de abril de 2023, archivado desde el original el 28 de abril de 2023 , consultado el 28 de abril de 2023
  104. ^abcd Arquero 2001.
  105. ^ Lippert, Eric (19 de marzo de 2009). "Representación e identidad". Fabulous Adventures In Coding . Blogs.msdn.com. Archivado desde el original el 12 de julio de 2011 . Consultado el 4 de octubre de 2012 .
  106. ^ "Bibliotecas de Framework". Microsoft Learn . 19 de abril de 2023. Archivado desde el original el 14 de julio de 2019 . Consultado el 14 de julio de 2019 .
  107. ^ BillWagner. "Novedades de C# 9.0: guía de C#". Microsoft Learn . Archivado desde el original el 5 de septiembre de 2020. Consultado el 14 de mayo de 2021 .
  108. ^ BillWagner. «Argumentos de línea de comandos y main()». Microsoft Learn . Archivado desde el original el 5 de agosto de 2021. Consultado el 5 de agosto de 2021 .
  109. ^ "Cómo liberar el poder de los genéricos de C#: una guía completa". 24 de abril de 2024.
  110. ^ "Patent Pledge for Open Source Developers" (Compromiso de patentes para desarrolladores de código abierto). 16 de marzo de 2023. Archivado desde el original el 7 de diciembre de 2017. Consultado el 28 de octubre de 2017 .
  111. ^ "Patent Cooperation Agreement - Microsoft & Novell Interoperability Collaboration". 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 su propio nombre y en el de sus Subsidiarias (en conjunto, "Microsoft"), por la presente se compromete a no demandar a los Clientes de Novell ni a los Clientes de las Subsidiarias de Novell por infracciones de las Patentes Cubiertas de Microsoft debido al uso por parte de dichos Clientes de copias específicas de un Producto Cubierto distribuido por Novell o sus Subsidiarias (en conjunto, "Novell") por el cual Novell haya recibido Ingresos (directa o indirectamente) por dichas copias específicas; siempre que el pacto anterior se limite al uso por parte de dicho Cliente (i) de dichas copias específicas que estén autorizadas por Novell a cambio de dichos Ingresos, y (ii) dentro del alcance autorizado por Novell a cambio de dichos Ingresos.
  112. ^ "Definiciones". Microsoft . 2 de noviembre de 2006. Archivado desde el original el 4 de noviembre de 2012 . Consultado el 5 de julio de 2009 .
  113. ^ Steinman, Justin (7 de noviembre de 2006). "Novell responde a las preguntas de la comunidad". Archivado desde el original el 16 de julio de 2013. Consultado el 5 de julio de 2009. Sostenemos que Mono no infringe ninguna patente de Microsoft.
  114. ^ "Pacto con los destinatarios posteriores de Moonlight: colaboración de interoperabilidad entre 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" significa una entidad o individuo que utiliza para el 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 (incluso descontinuar) el convenio anterior... "Implementación de Moonlight" significa únicamente aquellas partes específicas de Moonlight 1.0 o Moonlight 1.1 que se ejecutan únicamente como un complemento de un navegador en una computadora personal y no tienen licencia GPLv3 o una Licencia similar.
  115. ^ ab "¡La transición a RyuJIT está completa!". microsoft.com . 19 de junio de 2018. Archivado desde el original el 19 de julio de 2019 . Consultado el 20 de julio de 2021 .
  116. ^ "Proceso de ejecución administrada". microsoft.com . Archivado desde el original el 23 de diciembre de 2017. Consultado el 20 de julio de 2021 .
  117. ^ "coreclr/src/jit/". github.com . Archivado desde el original el 9 de enero de 2019 . Consultado el 20 de julio de 2021 .
  118. ^ "Guía de C#". Microsoft Learn . Archivado desde el original el 13 de agosto de 2022 . Consultado el 28 de julio de 2017 .
  119. ^ "5.0.8". microsoft.com . Archivado desde el original el 23 de abril de 2020 . Consultado el 20 de julio de 2021 .
  120. ^ "Mitigación: nuevo compilador JIT de 64 bits". microsoft.com . Archivado desde el original el 5 de abril de 2018. Consultado el 20 de julio de 2021 .
  121. ^ Etcheverry, Ignacio (21 de octubre de 2017). «Introducción a C# en Godot». Godot Engine . Archivado desde el original el 26 de octubre de 2018 . Consultado el 26 de octubre de 2018 .

Fuentes

  • Albahari, Joseph (2022). Do sostenido 10 en pocas palabras (Primera edición). 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). Do sostenido en profundidad (cuarta edición). Manning. ISBN 978-1617294532.

Lectura adicional

  • 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 C# de la ISO
  • Código fuente de la plataforma de compilación de C# ("Roslyn")
Obtenido de "https://es.wikipedia.org/w/index.php?title=C_Sharp_(lenguaje_de_programación)&oldid=1249480984#Implementaciones"