1. Breve historia de C / C++ / C#
Durante el desarrollo de la plataforma .NET, las bibliotecas de clases fueron escritas originalmente usando un
sistema de código gestionado llamado Simple Managed C (SMC). En enero de 1999, AndersHejlsberg formó
un equipo con la misión de desarrollar un nuevo lenguaje de programación llamado Cool (Lenguaje C
orientado a objetos). Este nombre tuvo que ser cambiado debido a problemas de marca, pasando a llamarse
C#.2 La biblioteca de clases de la plataforma .NET fue migrada entonces al nuevo lenguaje.
Hejlsberg lideró el proyecto de desarrollo de C#. Anteriormente, ya había participado en el desarrollo de otros
lenguajes como Turbo Pascal, Delphi y J+.
La historia de C parte de un lenguaje anterior, el lenguaje B, escrito por Ken Thompson en 1970 con el
objetivo de recodificar el sistema operativo UNIX, que hasta el momento se había programado en
ensamblador. La pega del ensamblador era que lo ligaba a una serie de máquinas concretas, por lo que
conseguir un lenguaje abstraído de cada máquina conseguiría una portabilidad del sistema muchísimo mayor.
A su vez B fue inspirado en el BCPL de Martin Richard, diseñado tres años antes.
En 1972 es Dennis Ritchie (de los Laboratorios Bell de AT&T) quien diseña finalmente C a partir del B de
Thompson, aportando un diseño de tipos y estructuras de datos que consiguen una claridad y eficacia en el
lenguaje muy superior. Es un lenguaje que permite realizar una programación estructurada economizando las
expresiones, con abundancia de operadores y tipos de datos (aunque los básicos sean pocos), codificando en
alto y bajo nivel simultáneamente, reemplazando ventajosamente la programación en ensamblador y
permitiendo una utilización natural de las funciones primitivas del sistema. Además, no está orientado a
ningún área en especial y sobre todo consigue un código objeto altamente optimizado que repercute en que los
programas son muy rápidos.
Durante muchos años no existen reglas estándar para el lenguaje, pero en 1983 se decide formar un comité
con el objetivo de crear el estándar ANSI (Instituto Nacional Americano de Estándares). El proceso dura seis
años y a principios de los 90 el estándar es reconocido por la ISO (Organización Internacional de Estándares)
y comienza a comercializarse con el nombre ANSI C.
Paralelamente, en 1980 surge C++ de la mano de BjarneStroustrup (también de Laboratorios Bell de AT&T).
Diseña este lenguaje con el objetivo de añadir a C nuevas características: clases y funciones virtuales (de
SIMULA67), tipos genéricos y expresiones (de ADA), la posibilidad de declarar variables en cualquier punto
del programa (de ALGOL68), y sobre todo, un auténtico motor de objetos con herencia múltiple que permite
combinar la programación imperativa de C con la programación orientada a objetos. Estas nuevas
características mantienen siempre la esencia del lenguaje C: otorgan el control absoluto de la aplicación al
programador, consiguiendo una velocidad muy superior a la ofrecida por otros lenguajes.El siguiente hecho
fundamental en la evolución de C++ es sin duda la incorporación de la librería STL años más tarde, obra de
Alexander Stepanov y AdrewKoening. Esta librería de clases con contenedores y algoritmos genéricos
proporciona a C++ una potencia única entre los lenguajes de alto nivel.
Debido al éxito del lenguaje, en 1990 se reúnen las organizaciones ANSI e ISO para definir un estándar que
formalice el lenguaje. El proceso culmina en 1998 con la aprobación del ANSI C++.
La última variante que ha surgido de C es el moderno C#. En el año 2000, Microsoft presenta su plataforma
.NET junto con un nuevo lenguaje, C# (diseñado por AndersHejlsberg), que servirá de lenguaje principal de
2. la plataforma. C# es un híbrido de C++ y Java que fusiona, principalmente, la capacidad de combinar
operadores propia del primero (no incorpora la herencia múltiple) con la plena orientación a objetos del
segundo. La orientación a objetos es tal que el propio programa está encapsulado en una clase.Actualmente
C# se encuentra entre los 10 lenguajes más utilizados. A pesar de su corta historia, ha recibido la aprobación
del estándar de dos organizaciones: en el 2001 se aprueba el ECMA y en el 2003 el ISO.
Información sobre C#
C# (pronunciado si sharp en inglés) 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 (ECMA-334) e ISO (ISO/IEC 23270). C# es uno de los lenguajes de programación diseñados
para la infraestructura de lenguaje común.
Su sintaxis básica deriva de C/C++ y utiliza el modelo de objetos de la plataforma .NET, similar al de Java,
aunque incluye mejoras derivadas de otros lenguajes.
El nombre C Sharp fue inspirado por la notación musical, donde '#' (sostenido, en inglés sharp) indica que la
nota (C es la nota do en inglés) es un semitono más alta, sugiriendo que C# es superior a C/C++. Además, el
signo '#' se compone de cuatro signos '+' pegados.1
Aunque C# forma parte de la plataforma .NET, ésta es una API. mientras que C# es un lenguaje de
programación independiente diseñado para generar programas sobre dicha plataforma. Ya existe un
compilador implementado que provee el marco Mono - DotGNU, el cual genera programas para distintas
plataformas como Windows, Unix, Android, iOS, Windows Phone, Mac OS y GNU/Linux
Características principales de C#
A continuación enumeramos las principales características que definen al lenguaje de programación C#.
Algunas de estas características no son propias del lenguaje, sino de la plataforma .NET, aunque se listan aquí
ya que tienen una implicación directa en ellenguaje.
Sencillez de uso
C# elimina muchos elementos añadidos por otros lenguajes y quefacilitan su uso y compresión, como por
ejemplo ficheros de cabecera, oficheros fuentes IDL1.12. Es por ello que se dice que C# esautocontenido.
Además, no se incorporan al lenguaje elementos pocoútiles, como por ejemplo macros, herencia múltiple u
operadoresdiferentes al operador de acceso a métodos (operador punto) paraacceder a miembros de espacios
de nombres.
Modernidad
Al ser C# un lenguaje de última generación, incorpora elementos que seha demostrado a lo largo del tiempo
que son muy útiles para elprogramador, como tipos decimales o
Booleanos, un tipo básicostring,así como una instrucción que permita recorrer colecciones con facilidad
(instrucciónforeach). Estos elementos hay que simularlos en otroslenguajes como C++ o Java.
Orientado a objetos
C# como lenguaje de última generación, y de propósito general, esorientado a objetos. C# no permite la
inclusión de funciones ni variablesglobales que no estén incluidos en una definición de tipos, por lo que
laorientación a objetos es más pura y clara que en otros lenguajes comoC++. Además, C# soporta todas las
características del paradigma de laprogramación orientada a objetos, como son la
Encapsulación, laherencia y el polimorfismo
Orientado a componentes
La propia sintaxis de C# incluye elementos propios del diseño decomponentes que otros lenguajes tienen que
simular. La sintaxis de C#incluye por ejemplo formas de definir propiedades,eventos oatributos.
3. Recolección de basura
Como ya se comentó, todo lenguaje incluido en la plataforma .NET tienea su disposición el recolector de
basura del CLR. Esto implica que no esnecesario incluir instrucciones de destrucción de objetos en el
lenguaje.
Seguridad de tipos
C# incluye mecanismos de control de acceso a tipos de datos, lo quegarantiza que no se produzcan errores
difíciles de detectar como unacceso a memoria de ningún objeto, por ejemplo. Para ello, el lenguajeprovee de
una serie de normas de sintaxis, como por ejemplo no realizarconversiones entre tipos que no sean
compatibles. Además, no sepueden usar variables no inicializadas previamente, y en el acceso atablas se hace
una comprobación de rangos para que no se excedanninguno de los índices de la misma. Se puede controlar
así mismo los desbordamientosen operaciones aritméticas, produciéndoseexcepciones cuando se produzcan.
Instrucciones seguras
Para evitar errores comunes como se producían programando en otroslenguajes, en C# se han impuesto una
serie de restricciones en el uso deinstrucciones de control más comunes. Por ejemplo, la evaluación detoda
condición ha de ser una expresión condicional y no aritmética,como ocurría por ejemplo en C o en C++. Así
se evitan errores porconfusión del operador igualdad con el de asignación. Otra restricciónque se impone en la
instrucción de selecciónswitch, imponiendo quetoda selectora de la instrucción finalice con unainstrucción
breakogotoque indique cuál es la siguiente acción a realizar.
Unificación de tipos
En C# todos los tipos derivan de una superclase común llamadaSystem.Object, por lo que automáticamente
heredarán todos losmiembros definidos en esta clase. Es decir, sonobjetos. A diferencia de Java, en C# esta
característica también se aplica para los tipos básicos.
•
Extensión de los operadores básicos
Para facilitar la legibilidad de código y conseguir que los nuevos tipos dedatos que se definan a través de las
estructuras estén al mismo nivelque los elementos predefinidos en el lenguaje, al igual que C++ pero
adiferencia de Java, C# permite redefinir el significado de la mayoría delos operadores (incluidos el de la
conversión) cuando se apliquen a diferentes tipos de objetos.
Las redefiniciones de operadores se hacen de manera inteligente, de modo que a partir de una única definición
de los operadores++ y -el compilador puede deducir automáticamente cómo ejecutarlos de manera prefija y
postfija. Definiendooperadores simples como la suma, el compilador deduce como aplicar la versión
designación compuesta (+=). Además, para asegurar la consistencia, el compilador exige que los operadores
con opuesto (como por ejemplo el operador igualdad ==ysu opuesto!=) siempre se redefinan por parejas.
Extensión de modificadores
C# ofrece, a través de losatributos, la posibilidad de añadir a losmetadatos del módulo resultante de la
compilación de cualquier fuente de información adicional a la generada por el compilador que luego podráser
consultada en tiempo de ejecución a través de la biblioteca dereflexión de .NET.
Eficiente
En C#, todo el código incluye numerosas restricciones para garantizar suseguridad, no permitiendo el uso de
punteros. Sin embargo, y adiferencia de Java, existen modificadores para saltarse esta restricción,pudiendo
manipular objetos a través de punteros. Para ello bastaidentificar regiones de código con el identificador
unsafe, y podránusarse en ellas punteros de forma similar a como se hace en C++. Estacaracterística puede
resultar de utilidad en situaciones en las que senecesite gran velocidad de procesamiento.
Tipos para definir números enteros:
Tipo de datos de enteros
Tipo
byte
Equivalente
BCL
System.Byte
Tamaño
8-bit (1-
Rango
0 a 255
Significado
Entero sin
4. byte)
signo
sbyte
System.SByte
8-bit (1byte)
Entero con
signo
short
System.Int16
16-bit (2-32.768 a 32.767
byte)
Entero corto
con signo
ushort System.UInt16
16-bit (20 a 65.535
byte)
Entero corto
sin signo
int
System.Int32
32-bit (4-2.147.483.648 a 2.147.483.647
byte)
Entero medio
con signo
uint
System.UInt32
32-bit (40 a 4.294.967.295
byte)
Entero medio
sin signo
long
System.Int64
64-bit (8- -9.223.372.036.854.775.808 a
byte)
9.223.372.036.854.775.807
Entero largo
con signo
ulong
System.UInt64
64-bit (80 a 18.446.744.073.709.551.615
byte)
Entero largo
sin signo
-128 a 127
Los tipos de coma flotante pueden representar números con componentes fraccionales.
Existen dos clases de tipos de coma flotante: float y double. El tipo double es el más
utilizado porque muchas funciones matemáticas de la biblioteca de clases de C# usan
valores double. Quizá, el tipo de coma flotante más interesante de C# es decimal, dirigido
al uso de cálculos monetarios. La aritmética de coma flotante normal está sujeta a una
variedad de errores de redondeo cuando se aplica a valores decimales. El tipo decimal
elimina estos errores y puede representar hasta 28 lugares decimales.
Tipo de datos de coma flotante
Tipo
Equivalente
BCL
Tamaño
Rango
Significado
float
System.Single
32-bit (4±1.401298E−45 a ±3.402823E+38
byte)
Coma
flotante corto
double
System.Double
64-bit (8- ±4.94065645841246E−324 a
byte)
±1.79769313486232E+308
Coma
flotante largo
decimal System.Decimal
−7.9228162514264337593543950335 Coma
128-bit
a
flotante
(16-byte)
+7.9228162514264337593543950335 monetario
Los caracteres en C# no tienen un tamaño de 8 bits como en otros muchos lenguajes de
programación, sino que usa un tamaño de 16 bits llamado Unicode al cual se le llama char.
No existen conversiones automáticas de tipo entero a char.
Tipo de datos de caracteres
Tipo Equivalente BCL
Tamaño
Rango
Significado
5. char System.Char
16-bit (2-byte) 'u0000' a 'uFFFF' Carácter unicode
Para los tipos de datos lógicos no existen conversiones automáticas de tipo entero a bool.
Tipo de datos lógicos
Tipo Equivalente BCL
bool System.Boolean
Tamaño
Rango
Significado
8-bit (1-byte) true o false Verdadero o falso
En ocasiones, resulta más sencillo usar un sistema numérico en base 16 en lugar de 10, para
tal caso C# permite especificar números enteros en formato hexadecimal, y se define
anteponiendo 0x, por ejemplo: 0xFF, que equivale a 255 en decimal.
C# tiene caracteres denominados secuencias de escape para facilitar la escritura con el
teclado de símbolos que carecen de representación visual.
C#, al igual que C++, define un tipo de cadena de caracteres. Dentro de la cadena de
caracteres se pueden usar secuencias de escape. Una cadena de caracteres puede iniciarse
con el símbolo @ seguido por una cadena entre comillas ("), en tal caso, las secuencias de
escape no tienen efecto, y además la cadena puede ocupar dos o más líneas.
Enteros
decimal
245, [0..9]+
hexadecimal
0xF5, 0x[0..9, A..F, a..f]+
entero largo
12L
entero largo sin signo 654UL
Coma flotante
float
23.5F, 23.5f; 1.72E3F, 1.72E3f, 1.72e3F, 1.72e3f
double
23.5, 23.5D, 23.5d, 1.72E3, 1.72E3D
decimal
9.95M
Caracteres
char
'a', 'Z', 'u0231'
Cadenas
String
"Hello, world"; "C:Windows", @"C:Windows"
Secuencias de escape
Alerta (timbre)
a
Retroceso
b
Avance de página
f
6. Nueva Línea
Retorno de carro
n
r
Tabulador horizontal t
Tabulador vertical
v
Nulo
0
Comilla simple
'
Comilla doble
"
Barra inversa