| Artículos | 01 MAR 2001

Introducción a C #

Tags: Histórico
Analizamos el nuevo lenguaje desarrollado por Microsoft
Francisco Charte.
Una de las novedades más interesantes presentadas por Microsoft en los últimos años, en cuanto a los desarrolladores se refiere, es el nuevo lenguaje C#. En este artículo le mostramos sus características más importantes.

En los números de PC World de los meses previos, de octubre a enero, se han tratado los aspectos más importantes de la plataforma Microsoft .NET, las novedades en el futuro Visual Basic.NET y la beta 1 de Visual Studio.NET. En este artículo nos ocuparemos de otra de las novedades más relevantes que traerá consigo Visual Studio.NET: el nuevo lenguaje C#.
Basado en el lenguaje C++, C# combina la potencia de dicho lenguaje con la simplicidad de Visual Basic.NET, pudiendo utilizarse exactamente los mismos diseñadores, objetos y propiedades a la hora de construir una aplicación. Si ha usado en alguna ocasión C++, Java o incluso Object Pascal, verá que muchas estructuras de C# le resultarán familiares. Esto contribuye a que la curva de aprendizaje del nuevo lenguaje sea más suave.
La referencia completa del lenguaje C# puede encontrarla en el Microsoft .NET Development Kit, así como con la beta 1 de Visual Studio.NET. En este artículo nos centraremos en las características más destacables, sin pretender construir un material de referencia.

Espacios con nombre
Las aplicaciones que se desarrollan en los últimos tiempos son cada vez más complejas, participando en dicho desarrollo un importante número de componentes que simplifican diversas tareas. La existencia de tantos componentes puede causar conflictos si hay coincidencias de nomenclatura y, por ello, el modelo de componentes COM usa los GUID (Globally Unique Identifier) como mecanismo estándar de identificación. Trabajar con GUID para identificar interfaces, caso en el que se les denomina IID, o clases, conocidos como CLSID, no es precisamente algo cómodo. Un GUID es un número de 128 bits, o 16 bytes, prácticamente imposible de recordar.
En la plataforma .NET se ha optado por una solución alternativa: la construcción de ámbitos o espacios con nombres jerárquicos. Un ámbito con nombre, del inglés namespace, es un espacio delimitado de manera explícita y al que se asocia un identificador. Los ámbitos con nombre pueden anidarse unos dentro de otros, dando lugar a jerarquías más o menos complejas.
La Figura 1 es una representación parcial, muy reducida, del ámbito System que, a su vez, contiene a los ámbitos WinForms y Web. Este último cuenta con otros llamados Services y UI. Para construir una referencia a un determinado ámbito usaríamos los distintos identificadores separando unos de otros mediante un punto. La referencia System.Web.UI, por ejemplo, hace referencia al ámbito UI contenido en el ámbito Web que, a su vez, pertenece al ámbito System.
Definir un ámbito con nombre, o varios anidados, es una tarea bastante sencilla. Basta con disponer la palabra namespace seguida del nombre que deseamos asignar al ámbito, cuyo contenido se delimitará entre llaves. En el Listado 1, por ejemplo, puede ver cómo se ha definido un ámbito, llamado PCWorld, en cuyo interior existe otro con el nombre N173. Tenemos, por tanto, un ámbito cuyo nombre completo es PCWorld.N173, conteniendo una clase muy sencilla.
Para utilizar una clase o tipo definido en el interior de un ámbito con nombre, delante del propio nombre del tipo habrá que indicar el identificador completo del ámbito. Puede verlo en el propio Listado 1, en el que para usar la clase Console hemos dispuesto delante el nombre del ámbito System.
Una alternativa, útil cuando va a utilizarse repetidamente uno o más tipos de un ámbito, consiste en usar la sentencia using. En el Listado 2 puede ver cómo utilizando dicha sentencia importamos en nuestro propio ámbito las definiciones del ámbito System, de tal forma que podemos usar las clases y tipos contenidas en él directamente, sin necesidad de anteponer el nombre del ámbito.

Clases
Un ámbito es un contenedor para alojar definiciones, ya sea de clases u otros tipos de datos. Como se ha visto, un ámbito también puede contener otros. De entre las definiciones posibles una de las más importantes es la de clase. En C# una clase es una entidad similar a la de cualquier lenguaje orientado a objetos, siendo la sintaxis parecida a la de C++.
Al definir una clase se está facilitando al compilador una plantilla a partir de la cual crear, con posterioridad, objetos con una funcionalidad concreta. La clase tendrá un identificador, que será el que se utilice para crear objetos o para referirse a elementos estáticos de la clase. En su interior, delimitados también entre llaves, podrá contener constantes, variables, métodos, propiedades, delegados y eventos.
Más que un lenguaje orientado a objetos, podríamos decir que C# es un lenguaje orientado a componentes, preparado para construir y usar componentes. Por ello en el interior de una clase no sólo existirán campos de datos y funciones para manipularlos, sino que también podremos tener elementos como las propiedades y los eventos, característicos de componentes que, además, sería factible manipular de forma visual.
De igual forma que un ámbito puede albergar en su interior a otro, una clase puede contar en su definición con otras clases anidadas. Es una característica existente en otros lenguajes y que permite estructurar aún más la jerarquía y el nivel de dependencias de unos elementos respecto a otros.
A diferencia de lo que ocurre en C++, las clases de C# no disponen de secciones públicas, protegidas y privadas que establezcan el nivel de accesibilidad de los distintos miembros. Este atributo se establece de manera individual para cada método, propiedad, evento, variable y constante, usando para ello modificadores como private, protected, internal y public que anteceden a la declaración de cada miembro.
Otra distinción importante de C# respecto a otros lenguajes es la ausencia de los conceptos definición e implementación como procesos separados. Una clase está implementándose en el mismo momento en que es definida, haciendo innecesarios elementos como los archivos de cabecera. Tampoco es importante el orden en que se definen las clases, de tal forma que una puede hacer uso de otra sin importar su localización, no precisándose declaraciones avanzadas como en C++.

Interfaces
La mayoría de los lenguajes orientados a objetos no cuentan con herencia múltiple, característica que permite crear una nueva clase derivando de dos o más bases. C++ sí cuenta con dicha posibilidad, pero no así otros lenguajes como Java u Object Pascal. La alternativa en dichos lenguajes, al igual que en C#, son las interfaces.
Podríamos definir una interfaz como un contrato en el que se definen, que no implementan, un conjunto de miembros indicando tipos, parámetros y otros atributos. La interfaz se publica de forma que tanto las clases que las implementan como los posibles consumidores la conozcan. Una misma clase puede implementar los miembros de varias interfaces, heredando tan sólo la definición como tal y no una implementación, como sí ocurre al derivar de una clase.
La definición de una interfaz se asemeja bastante a la de una clase, si bien existen algunas limitaciones como la imposibilidad de declarar miembros de datos. El fragmento de código siguiente, por ejemplo, define una interfaz para crear una pila de datos.

interface Pila

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información