C# nació con una visión clara: crear un lenguaje simple, moderno y de propósito general que aumentara la productividad del programador y pudiera adaptarse a múltiples escenarios. Aquí encontrarás los puntos clave de su origen, los paradigmas que lo definen y las decisiones que explican su vigencia.
¿Qué hace único a C# desde su origen?
C# surge en el auge de la programación orientada a objetos, cuando lenguajes como C++ y Java dominaban el mercado. Aunque nació orientado a objetos, desde el principio se planeó como lenguaje multiparadigma, capaz de adoptar diferentes enfoques según la necesidad.
¿Quién creó C# y qué aportó?
C# fue creado por Anders Hegelsberg. Se destaca por su amplia experiencia en creación de lenguajes, como Delphi y Type Scripts, y por liderar equipos de desarrollo durante años.
Anécdota cercana: el autor lo conoció en Microsoft cuando se hablaba del futuro de C# seis. Fue una reunión pequeña con alrededor de veinte empleados. Un encuentro inspirador y muy humano, con fotos y humor de por medio.
¿Por qué C# es multiparadigma y fuertemente tipado?
Es fuertemente tipado: los tipos deben declararse explícitamente. Si un componente tiene nombre, apellido y dirección, se define desde el comienzo. No se agregan campos nuevos sin especificación previa.
Con el tiempo incorporó funcionalidades que relajan ese rigor en ciertos casos, manteniendo el control del programador.
Combina orientación a objetos basada en clases con enfoque orientado a componentes, facilitando que piezas de software se conecten de forma desacoplada.
¿Qué significan sus paradigmas imperativo, declarativo y funcional?
Imperativo: se programa con sentencias que ordenan qué hacer y en qué flujo ejecutarlo.
Declarativo: se especifica el resultado y el lenguaje traduce esa intención en instrucciones, sin definir un flujo detallado.
Paradigma funcional: hoy C# incluye numerosos elementos funcionales que amplían las formas de expresar la lógica.
Programación genérica: estructura datos y objetos para manipularlos con facilidad y mejorar la eficiencia del sistema operativo o el framework que ejecuta el programa.
¿Qué principios de diseño definen al lenguaje?
Desde el inicio se fijaron principios para resolver problemas reales de desarrolladores de la época, con mirada a largo plazo.
¿Por qué se habla de simple, moderno y de propósito general?
Simple y moderno: frente a C++ y Visual Basic, se buscaba claridad y capacidades actualizadas, sin arrastrar complejidades históricas.
Propósito general: usable en múltiples contextos. Desde software para neveras y dispositivos hasta sitios web, aplicaciones de escritorio y servicios para Windows.
¿Cómo se garantiza robustez, durabilidad y productividad?
Robusto: con funcionalidades capaces de cubrir necesidades en entornos corporativos y proyectos que requieren alto rendimiento.
Durable: diseñado para durar muchos años y evolucionar con nuevas necesidades, evitando ser una moda pasajera.
Productividad: reduce la fricción al crear software real en producción. Más enfoque en resolver el problema y menos en detalles de bajo nivel.
¿Dónde corre C# y qué metas de plataforma y rendimiento tiene?
C# se pensó para ambientes distribuidos y escenarios modernos. Con el tiempo, sus objetivos de portabilidad, internacionalización y eficiencia se volvieron realidad de forma amplia.
¿Qué pasó con la portabilidad y el soporte multiplataforma?
Al inicio, la portabilidad era una promesa con estándar definido, pero solo Microsoft lo implementó y C# funcionaba en Windows.
Hoy es una realidad: C# corre en diferentes sistemas operativos y entornos, desde dispositivos móviles e internet de las cosas, hasta sitios web, nube, escritorio, Android y OS X.
¿Cómo aborda internacionalización, entornos embebidos y eficiencia?
Internacionalización: soporte para múltiples idiomas y codificaciones, clave para una empresa con negocios globales.
Servidores y entornos embebidos: pensado para ejecutarse tanto en servidores web como en dispositivos con Windows Embedded y otros equipos similares.
Bajo uso de procesamiento y memoria: busca eficiencia sin competir directamente con Assembler o C++, que operan sin intérprete. El objetivo es un equilibrio entre rendimiento y experiencia de desarrollo.
¿Te gustaría profundizar en las versiones de C# o en por qué se llama C# y no de otra forma? Comparte tus preguntas y experiencias en los comentarios.
C# nació con una visión clara: crear un lenguaje simple, moderno y de propósito general que aumentara la productividad del programador y pudiera adaptarse a múltiples escenarios. Aquí encontrarás los puntos clave de su origen, los paradigmas que lo definen y las decisiones que explican su vigencia.
¿Qué hace único a C# desde su origen?
C# surge en el auge de la programación orientada a objetos, cuando lenguajes como C++ y Java dominaban el mercado. Aunque nació orientado a objetos, desde el principio se planeó como lenguaje multiparadigma, capaz de adoptar diferentes enfoques según la necesidad.
¿Quién creó C# y qué aportó?
C# fue creado por Anders Hegelsberg. Se destaca por su amplia experiencia en creación de lenguajes, como Delphi y Type Scripts, y por liderar equipos de desarrollo durante años.
Anécdota cercana: el autor lo conoció en Microsoft cuando se hablaba del futuro de C# seis. Fue una reunión pequeña con alrededor de veinte empleados. Un encuentro inspirador y muy humano, con fotos y humor de por medio.
¿Por qué C# es multiparadigma y fuertemente tipado?
Es fuertemente tipado: los tipos deben declararse explícitamente. Si un componente tiene nombre, apellido y dirección, se define desde el comienzo. No se agregan campos nuevos sin especificación previa.
Con el tiempo incorporó funcionalidades que relajan ese rigor en ciertos casos, manteniendo el control del programador.
Combina orientación a objetos basada en clases con enfoque orientado a componentes, facilitando que piezas de software se conecten de forma desacoplada.
¿Qué significan sus paradigmas imperativo, declarativo y funcional?
Imperativo: se programa con sentencias que ordenan qué hacer y en qué flujo ejecutarlo.
Declarativo: se especifica el resultado y el lenguaje traduce esa intención en instrucciones, sin definir un flujo detallado.
Paradigma funcional: hoy C# incluye numerosos elementos funcionales que amplían las formas de expresar la lógica.
Programación genérica: estructura datos y objetos para manipularlos con facilidad y mejorar la eficiencia del sistema operativo o el framework que ejecuta el programa.
¿Qué principios de diseño definen al lenguaje?
Desde el inicio se fijaron principios para resolver problemas reales de desarrolladores de la época, con mirada a largo plazo.
¿Por qué se habla de simple, moderno y de propósito general?
Simple y moderno: frente a C++ y Visual Basic, se buscaba claridad y capacidades actualizadas, sin arrastrar complejidades históricas.
Propósito general: usable en múltiples contextos. Desde software para neveras y dispositivos hasta sitios web, aplicaciones de escritorio y servicios para Windows.
¿Cómo se garantiza robustez, durabilidad y productividad?
Robusto: con funcionalidades capaces de cubrir necesidades en entornos corporativos y proyectos que requieren alto rendimiento.
Durable: diseñado para durar muchos años y evolucionar con nuevas necesidades, evitando ser una moda pasajera.
Productividad: reduce la fricción al crear software real en producción. Más enfoque en resolver el problema y menos en detalles de bajo nivel.
¿Dónde corre C# y qué metas de plataforma y rendimiento tiene?
C# se pensó para ambientes distribuidos y escenarios modernos. Con el tiempo, sus objetivos de portabilidad, internacionalización y eficiencia se volvieron realidad de forma amplia.
¿Qué pasó con la portabilidad y el soporte multiplataforma?
Al inicio, la portabilidad era una promesa con estándar definido, pero solo Microsoft lo implementó y C# funcionaba en Windows.
Hoy es una realidad: C# corre en diferentes sistemas operativos y entornos, desde dispositivos móviles e internet de las cosas, hasta sitios web, nube, escritorio, Android y OS X.
¿Cómo aborda internacionalización, entornos embebidos y eficiencia?
Internacionalización: soporte para múltiples idiomas y codificaciones, clave para una empresa con negocios globales.
Servidores y entornos embebidos: pensado para ejecutarse tanto en servidores web como en dispositivos con Windows Embedded y otros equipos similares.
Bajo uso de procesamiento y memoria: busca eficiencia sin competir directamente con Assembler o C++, que operan sin intérprete. El objetivo es un equilibrio entre rendimiento y experiencia de desarrollo.
¿Te gustaría profundizar en las versiones de C# o en por qué se llama C# y no de otra forma? Comparte tus preguntas y experiencias en los comentarios.
C# es creado por Anders Hejilsberg y su equipo
C# es un lenguaje multiparadigma
Es un lenguaje strong typing(fuertemente tipado)
-Imperativo
-Declarativo
-alineado con el paradigma Functional
-orientado a objetos(basado en clases)
-orientado a componentes
C# Versión 1
Cuando echas la vista atrás, la primera versión de C# sí que se parecía un montón a Java. Como parte de sus objetivos de diseño escritos para ECMA, buscaba ser un “lenguaje orientado a objetos de uso general moderno y sencillo”. En aquel momento, podría haber hecho algo peor que mirar hacia Java para alcanzar dichos fines.
Pero si analizases la versión 1.0 de C# 1.0 hoy, te marearías. Carecía de capacidades asíncronas sólidas y de muchas de las “pulidas” funcionalidades relacionadas con los genéricos que hoy en día damos por sentadas. En realidad, carecía de genéricos en general. ¿Y LINQ? Nada. Eso tardaría aún unos cuantos años en salir.
La versión 1 de C# parecía estar bastante desprovista de funcionalidad, comparado con hoy. Al final te veías escribiendo código pesado. Pero bueno, como con cualquier versión 1.0: por algún lado hay que empezar…
C# Versión 2
Aquí las cosas se empiezan a poner interesantes. Repasemos algunas de las principales características de C# 2.0, lanzado en 2005, junto con Visual Studio 2005 (no te olvides de echarle un vistazo al libro escrito por el creador de NDepend, Patrick Smacchia, sobre .NET 2.0, disponible en inglés y francés).
Genéricos
Tipos parciales
Métodos anónimos
Tipos anulables
Iteradores
Covarianza y contravarianza
Aunque Microsoft puede que haya empezado con un lenguaje orientado a objetos bastante genérico, la versión 2 de C# lo cambió todo enseguida. Se pusieron a la tarea tras la salida de la versión inicial y fueron a por varias de las frustraciones que causaba. Y lo hicieron muy en serio.
Con genéricos, tienes tipos y métodos que pueden operar sobre un tipo arbitrario mientras que aún conservan seguridad de tipos. Así, por ejemplo, tener una List<T> te permite tener una List<string> o una List<int> y realizar operaciones seguras de tipo en esas cadenas de caracteres o ints mientras iteras por ellas. Esto es mucho mejor que crear clases derivadas de listas (ListInt?) o convertir a un Objeto para cada operación.
¡Ah!, y hablando de iteradores, la versión 2 de C# los presentó. Para resumir, esto te permite iterar por los ítems de una Lista (u otros tipos Enumerable) con un bucle foreach. Tener esto como un elemento de primera clase del lenguaje mejoró ostensiblemente la legibilidad del código y la capacidad para poder entenderlo.
Y aún así, Microsoft seguía intentando ponerse a la altura de Java. Java ya había liberado versiones que incluían genéricos e iteradores. Pero eso cambiaría pronto a medida que los lenguajes seguían una evolución diferente.
C# Versión 3
La versión 3 de C# apareció a finales de 2007, junto con Visual Studio 2008, aunque la funcionalidad completa aparecería con la versión 3.5 de C#. ¡Y menuda actualización resultó ser!. Yo me atrevería a afirmar que ese momento consolidó a C# como un lenguaje de programación realmente formidable. Veamos algunas de sus características principales en esta versión:
Propiedades auto-implementadas
Tipos anónimos
Expresiones de consulta - LINQ
Expresiones lambda
Árboles de expresión
Métodos de extensión
Con mirada retrospectiva, muchas de estas características parecen tanto inevitables como inseparables. De hecho, no es fácil destacar una sobre otra ya que todas encajan estratégicamente muy bien juntas.
Otros haciendo este mismo análisis no tendrán ese problema, y dirán que, de largo, la novedad más importante de la versión 3 de C# fue las expresiones de consulta, también conocidas como LINQ (Language INtegrated Query).
Yo creo que hay más matices y sutilezas puesto que, desde mi punto de vista, los árboles de expresión, las expresiones lambda y los tipos anónimos fueron los cimientos sobre los que se creó LINQ. Disertaciones aparte, lo cierto es que nos encontramos con un concepto realmente revolucionario. Microsoft había empezado a allanar el terreno para hacer de C# un lenguaje funcional orientado a objetos híbrido.
En concreto, con esta versión ya se podían programar búsquedas declarativas tipo SQL para llevar a cabo operaciones en colecciones, entre otras cosas. En vez de tener que crear un bucle para computar la media de una lista de enteros, ahora se podía hacer con algo tan fácil como list.Average(). La combinación de expresiones de búsqueda y métodos de extensión hizo parecer que las listas de enteros se habían hecho más inteligentes.
Llevó un tiempo hasta que los programadores realmente entendieron cómo integrar el concepto, pero a la larga lo lograron. Y ahora, unos años más tarde, el código es mucho más conciso, sencillo y funcional.
C# Versión 4
La versión 4 de C# nació con el estigma de no suponer una innovación rompedora como sí lo había sido su antecesora versión 3. Y es que con la versión 3, Microsoft hizo que el lenguaje dejase de estar a la sombra de Java y empezó a destacar. Rápidamente el lenguaje se estaba convirtiendo en una opción elegante.
De todos modos, la versión 4 de C# sí introdujo alguna cosas chulas.
Tipos dinámicos
Argumentos opcionales y con nombre
Covarianza y contravarianza genérica
Tipos interop embebidos
Los tipos interop embebidos aliviaron problemas a la hora del despliegue. La covarianza y contravarianza genéricas te dan mucha potencia, pero son demasiado académicas y probablemente sean más valoradas entre los creadores de frameworks y bibliotecas. Los argumentos opcionales y con nombre te permiten eliminar muchas sobrecargas de método y ofrecen comodidad. Pero ninguna de estas cosas altera el paradigma propiamente dicho.
Esa distinción sí se la llevan los tipo dinámico. Con esta característica, Microsoft introdujo en la versión 4 de C# la capacidad de anular el compilador al tiparlo en tiempo de compilación. Es decir, al usar el tipo de referencia dinámico, te puedes llegar a pegar un tiro en el pie como en los lenguajes de tipado dinámico como JavaScript. Puedes crear una “x = cadena de caracteres” dinámica y luego añadirle 6, dejando al tiempo de ejecución determinar qué diablos tiene que pasar después.
Esto lo digo un poco de broma obviamente. Está claro que cabe la posibilidad de cometer errores, pero también otorga mucha potencia dentro del lenguaje.
C# Versión 5
Con la versión 5 de C#, Microsoft liberó una versión con el foco muy puesto en la innovación del lenguaje. Esta es la lista de las características más importantes:
Programación asincrónica con Async y Await
Atributos Caller info
No quiero que se me malinterprete. El atributo caller info está muy bien. Te permite recuperar información sobre el contexto en el que estás sin tener que recurrir a un montón de código reflejo repetitivo. Me encanta esta funcionalidad en realidad.
Pero async y await son las verdaderas estrellas de esta versión. Cuando esto salió en 2012, Microsoft cambió las reglas del juego nuevamente al meter la asincronía en el lenguaje como un participante de primera clase. Si ya has gestionado operaciones largas y la implementación de páginas web con retro-llamadas, probablemente adores esta funcionalidad.
C# Versión 6
Con las versiones 3 y 5, Microsoft había hecho algunas cosas bastante impresionantes en un lenguaje orientado a objetos (la versión 2 también, pero estaban copiando conceptos de Java con esas funciones que introdujeron). Con la versión 6 se alejaron de la idea de sacar una novedad dominante estrella y, en vez de eso, liberaron muchas características para hacer felices a los usuarios del lenguaje de programación. Aquí enumero unas cuantas:
Importaciones estáticas (como en Java)
Filtros de excepciones
Inicializadores de propiedad
Miembros con una expresión como cuerpo
Propagador null
Cadenas interpoladas
Operador nameof
Inicializador del diccionario
Si las vemos de forma individual, todas estas características del lenguaje son muy interesantes. Pero si las valoramos en conjunto, observamos un patrón que nos llama la atención. En esta versión, Microsoft se ha esforzado en eliminar repeticiones en el lenguaje y hacer que el código sea más ligero y legible. Así que para los aficionados del código escueto y limpio, esta versión del lenguaje fue una gran victoria.
¡Ah!, e hicieron otra cosa con esta versión, aunque no se puede considerar como una función tradicional del lenguaje, per se. Liberaron Roslyn, el compilador, como servicio. Microsoft ahora usa C# para hacer C#, y te dejan usar el compilador como parte de tus esfuerzos de programación.
C# Versión 7
Finalmente hemos llegado ya a la versión 7 de C#. Es la versión actual en la fecha que se ha escrito este artículo. Tiene cosas muy chulas y revolucionarias que ya estaban en el ADN de la versión 6, pero sin el compilador como servicio. Aquí van las novedades de esta versión:
Variables out
Tuplas y deconstrucción
Coincidencia de patrones
Funciones locales
Extensión de la funcionalidad de miembros con una expresión como cuerpo aparecida en C# 6
Referencias locales y devoluciones
Todas ofrecen nuevas capacidades para que los desarrolladores puedan escribir código más limpio que nunca. En concreto, creo que Microsoft ha dado solución a problemas que venían desde muy lejos al condensar la declaración de variables que se pueden a usar con la palabra clave out y al permitir valores de devolución múltiples vía tuplas.
Además, Microsoft le está dando un uso más amplio al lenguaje. .NET ahora va dirigido a cualquier sistema operativo y tiene la vista puesta de forma firme en la nube y en la portabilidad. Esto es lo que más ocupa la mente y el tiempo de los diseñadores del lenguaje, además de pensar en nuevas características.
Conozco C# desde hace 15 años, y el lenguaje ha estado bajo desarrollo más tiempo que eso. Será emocionante ver qué funcionalidades y características deparará el futuro.
C# es un lenguaje multiparadigma
- Strong typing
- Imperative: basado en sentencias que específican qué se tiene que hacer.
- Declarative: no se tiene un flujo, sino una especificación.
- Functional: like Javascript.
- Generic: Manejo de memoria.
- Object-oriented (class-based): Basado en clases.
- Component-oriented: Permite que las diferentes piezas de software (módulos) se comuniquen.
Principio de C#
- Simple, moderno, de propósito general, orientado a objetos.
- Robusto, durable, productividad para el programador: mejor adaptable.
-Ambientes distribuidos: Microservicios.
- Portabilidad: Qué funcioné en multiples plataformas (OSs).
- Soporte para internacionalización: códificación de caracteres.
- Uso en servidores y entornos embebidos: IoT.
- Bajo uso de procesador y memorias.
Para los que esten haciendo este curso en 2022 y no ven lo mismo que ve el maestro les recomiendo que miren las ultimas actualizaciones de .Net 6.0
https://aka.ms/new-console-template
No deberia ser ningun problema seguir el curso, pero si quieren verlo exactamente como el amestro lo ve dentro del link se explica mejor como volver a los templates antiguos de c#
C# es un lenguaje de programación orientado a objetos desarrollado y estandarizado por Microsoft como parte de su plataforma .NET, que después fue aprobado como un estándar por la ECMA e ISO. C# es uno de los lenguajes de programación diseñados para la infraestructura de lenguaje común.
Sistema de tipos: Estático, dinámico, fuerte, seguro, nominal Última versión estable: 7.2 (15 de noviembre de 2017 (9 meses y 28 días)) Diseñador: Microsoft Influido por: Java, C++, Eiffel, Modula-3, Pascal Extensiones comunes: cs Ha influido a: D, F#, Java 5, Vala
Revelación máxima! Ni idea tenía de que el tal Anders Hejlsberg (y no Hejislsberg que aún lo hace más impronunciable ;)) es co-autor de Turbo Pascal, lenguaje con el que empecé en programación en el 92 (ahora la curiosidad se resuelve con un click, en esa época no, sin internet. QBasic, C, Pascal, Fortran, Cobol, Lisp, Karel,... qué recuerdos!) Gracias!
El nombre C# fue inspirado por la notación musical donde una almohadilla (#) indica que la nota escrita debe hacerse un semitono más alto en el tono. Esto es similar al nombre del lenguaje C++, donde “++” indica que una variable debe ser incrementada en 1. El símbolo de la almohadilla (#) también se asemeja a una ligadura de los cuatro símbolos “+” (en una cuadrícula de dos en dos), lo que implica que el lenguaje es un incremento de C++ tal y como se puede observar en la siguiente imagen. Fuente: https://bit.ly/2P2HsQR