C# lenguaje de programación

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 (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 el signo '#' que se compone de cuatro signos '+' pegados.
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 Microsoft, Unix, Android, iOS, Windows Phone, Mac OS y GNU/Linux.

C# es un lenguaje elegante, con seguridad de tipos y orientado a objetos, que permite a los desarrolladores crear una gran variedad de aplicaciones seguras y sólidas que se ejecutan en .NET Framework .NET. Puede usar C# para crear aplicaciones cliente de Windows, servicios web XML, componentes distribuidos, aplicaciones cliente-servidor, aplicaciones de base de datos y muchas, muchas más cosas. Visual C# proporciona un editor de código avanzado, prácticos diseñadores de interfaz de usuario, un depurador integrado y muchas otras herramientas que facilitan el desarrollo de aplicaciones basadas en el lenguaje C# y .NET Framework.



Clases y objetos


Una variable de objeto de cierta clase no almacena los valores del objeto sino su referencia (al igual que Java).
El operador de asignación no copia los valores de un objeto, sino la referencia al mismo (al igual que Java).
Un constructor tiene el mismo nombre que su clase y es sintácticamente similar a un método.
Un constructor no devuelve ningún valor (ni siquiera void).
Al igual que los métodos, los constructores también pueden ser sobrecargados.
Si no se especifica un constructor en una clase, se usa uno por defecto que consiste en asignar a todas las variables el valor 0, null o false según corresponda.


Cuando un objeto no es referenciado por ninguna variable, el recolector de basura ejecuta el destructor de dicha clase y libera la memoria utilizada.
El destructor de una clase no se llama cuando un objeto sale del ámbito.
Todos los destructores se llamarán antes de que finalice un programa.
La palabra clave this es una referencia al mismo objeto en el cual se usa.
La palabra clave base es una referencia a la clase padre del objeto en la que se usa (por defecto, Object).

La palabra clave static hace que un miembro pertenezca a una clase en vez de pertenecer a objetos de dicha clase. Se puede tener acceso a dicho miembro antes de que se cree cualquier objeto de su clase y sin referencias a un objeto.


Un método static no tiene una referencia this.
Un método static puede llamar sólo a otros métodos static.
Un método static sólo debe tener acceso directamente a datos static.
Un constructor static se usa para inicializar atributos que se aplican a una clase en lugar de aplicarse a una instancia.

C# permite la sobrecarga de operadores (+, -, *, etc.) con la palabra clave operador.
Al comparar objetos (==, !=, <, >, <=, >=) se comprueba si hacen referencia al mismo objeto.



Características

Su sintaxis básica deriva de C/C++ y utiliza el modelo de objetos de la plataforma.NET el cual es similar al de Java, aunque incluye mejoras derivadas de otros lenguajes (entre ellos Delphi).


La creación del nombre del lenguaje, C, proviene de dibujar dos signos positivos encima de los dos signos positivos de "C++", queriendo dar una imagen de salto evolutivo del mismo modo que ocurrió con el paso de C a C++.

C, como parte de la plataforma.NET, está normalizado por ECMA desde diciembre de 2001 (C# Lenguaje Especificación "Especificación del lenguaje C"). El 7 de noviembre de 2005 salió la versión 2.0 del lenguaje que incluía mejoras tales como tipos genéricos, métodos anónimos, integradores, tipos parciales y tipos anulables. El 19 de noviembre de 2007 salió la versión 3.0 de C# destacando entre las mejoras los tipos implícitos, tipos anónimos y LINQ (Lenguaje Intégral Query -consulta integrada en el lenguaje).


Aunque C forma parte de la plataforma.NET, ésta es una interfaz de programación de aplicaciones (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 de DotGNU - Mono que genera programas para distintas plataformas como Win32, UNIX y Linux.

Sencillez de uso

 C# elimina muchos elementos añadidos por otros lenguajes y que facilitan su uso y compresión, como por ejemplo ficheros de cabecera, o ficheros fuentes IDL1 .12. Es por ello que se dice que C# es auto contenido. Además, no se incorporan al lenguaje elementos poco útiles, como por ejemplo macros, herencia múltiple u operadores diferentes al operador de acceso a métodos (operador punto) para acceder a miembros de espacios de nombres.

Modernidad

 Al ser C# un lenguaje de última generación, incorpora elementos que sea demostrado a lo largo del tiempo que son muy útiles para el programador, como tipos decimales obooleanos, un tipo básico string ,así como una instrucción que permita recorrer colecciones con facilidad(instrucción foreach). Estos elementos hay que simularlos en otros lenguajes como C++ o Java.

Orientado a objetos

 C# como lenguaje de última generación, y de propósito general, es orientado a objetos. C# no permite la inclusión de funciones ni variables globales que no estén incluidos en una definición de tipos, por lo que la orientación a objetos es más pura y clara que en otros lenguajes como C++. Además, C# soporta todas las características del paradigma de la programación orientada a objetos, como son la encapsulación, la herencia y el polimorfismo.



Orientado a componentes

 La propia sintaxis de C# incluye elementos propios del diseño de componentes que otros lenguajes tienen que simular. La sintaxis de C# incluye por ejemplo formas de definir propiedades, eventos o atributos.

Recolección de basura

 Como ya se comentó, todo lenguaje incluido en la plataforma .NET tiene su disposición el recolector de basura del CLR. Esto implica que no es necesario 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 que garantiza que no se produzcan errores difíciles de detectar como un acceso a memoria de ningún objeto, por ejemplo. Para ello, el lenguaje provee de una serie de normas de sintaxis, como por ejemplo no realizar conversiones entre tipos que no sean compatibles. Además, no se pueden usar variables no inicializadas previamente, y en el acceso atablas se hace una comprobación de rangos para que no se excedan ninguno de los índices de la misma. Se puede controlar así mismo los desbordamientos en operaciones aritméticas, produciéndose excepciones cuando se produzcan.


Instrucciones seguras

 Para evitar errores comunes como se producían programando en otros lenguajes, en C# se han impuesto una serie de restricciones en el uso de instrucciones de control más comunes. Por ejemplo, la evaluación de toda 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 por confusión del operador igualdad con el de asignación. Otra restricción que se impone en la instrucción de selección switch, imponiendo que toda selectora de la instrucción finalice con una instrucción break  ogoto que 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 llamada System.Object , por lo que automáticamente heredarán todos los miembros definidos en esta clase. Es decir, son objetos. 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 de datos que se definan a través de las estructuras estén al mismo nivel que los elementos predefinidos en el lenguaje, al igual que C++ pero a diferencia 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. Definiendo operadores simples como la suma, el compilador deduce como aplicar la versión de asignación compuesta (+=9). Además, para asegurar la consistencia, el compilador exige que los operadores con opuesto (como por ejemplo el operador igualdad == y su opuesto!=) siempre se redefinan por parejas.

Extensión de modificadores

 C# ofrece, a través de los atributos, la posibilidad de añadir a los metadatos del módulo resultante de la compilación de cualquier fuente 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 de reflexión de .NET.

Eficiente

 En C#, todo el código incluye numerosas restricciones para garantizar su seguridad, no permitiendo el uso de punteros. Sin embargo, y a diferencia de Java, existen modificadores para saltarse esta restricción, pudiendo manipular objetos a través de punteros. Para ello basta identificar regiones de código con el identificador un zafe, y podrán usarse en ellas punteros de forma similar a como se hace en C++. Esta característica puede resultar de utilidad en situaciones en las que se necesite gran velocidad de procesamiento.

Compatible

 Para facilitar la migración de programadores de C++ o Java a C#, no sólo se mantiene una sintaxis muy similar a la de los dos anteriores lenguajes, sino que el CLR también ofrece la posibilidad de acceder a código nativo escrito como funciones sueltas no orientadas a objetos, tales como las DLLs de la API de Win32.