Una característica común a este tipo de lenguajes de alto nivel, es la presencia del manejo de excepciones.
Una característica común a este tipo de lenguajes de alto nivel, es la presencia del manejo de excepciones.
Cuando estamos trabajando con diferentes tipos de datos, siempre conviene conocer los mecanismos para convertir un tipo de datos en otros. Si a eso le sumamos, que podamos hacer aplicaciones en las que se trabaje introduciendo datos siguiente el formalismo español (comas para separar decimales, puntos para separar miles) o viceversa (podéis ver un mapa de dónde se usa cada separador decimal aquí).
Esto es lo que se llama la información cultural, que se sitúa dentro del ensamblado: System.Globalization, y que aparte de en este tema es conveniente conocer para otras tareas.
Casting
Es la forma más simple de hacer una conversión de datos. Está directamente heredada de C y puede ser implícita (si no se especifica) o explícita (cuando sí lo hacemos). Tiene grandes limitaciones porque básicamente sólo permite no convertir, sino camuflar, para una instrucción en concreto el tipo de dato.
Veamos un ejemplo:
int i = 10; float f = 0; f = i; // conversión implícita f = 0.5F; i = (int)f; // conversión explícita. Existe pérdida de información, los decimales
Métodos ToString
Al igual que en otros muchos lenguajes de programación, a este nivel de abstracción, existe un método ToString, definido en cada clase, que convierte cualquier objeto en una cadena. Si tenemos un entero que tiene dentro el valor 1, devolverá una cadena “1”; igualmente pasará con un decimal, pero aquí es donde entra la información cultural en juego. Si tenemos la cultura predefinida como la española, mostrará comas y punto de acuerdo a nuestra forma de hacerlo, si definimos otra cultura predefinida, el comportamiento cambiará conforme a eso. También podemos cambiar de forma puntual la cultura predefinida para un punto en concreto.
Veamos ejemplos de uso avanzado de ToString usando especificadores, para mostrar el mismo número por pantalla con decimales, sin ellos, en formato moneda, con porcentaje…
decimal valor = 16325.62m; string especificador; // Sin especificador Console.WriteLine("Sin el especificador tenemos el valor: " + valor.ToString()); // Especificador numérico estándar especificador = "G"; Console.WriteLine("Con el especificador: " + especificador + " tenemos el valor: " + valor.ToString(especificador)); // Muestra: 16325,62 especificador = "C"; Console.WriteLine("Con el especificador: " + especificador + " tenemos el valor: " + valor.ToString(especificador)); // Muestra: 16.325,62€ especificador = "E04"; Console.WriteLine("Con el especificador: " + especificador + " tenemos el valor: " + valor.ToString(especificador)); // Muestra: 1,6326E+004 especificador = "F"; Console.WriteLine("Con el especificador: " + especificador + " tenemos el valor: " + valor.ToString(especificador)); // Muestra: 16325,62 especificador = "N"; Console.WriteLine("Con el especificador: " + especificador + " tenemos el valor: " + valor.ToString(especificador)); // Muestra: 16.325,62 especificador = "P"; Console.WriteLine("Con el especificador: " + especificador + " tenemos el valor: " + valor.ToString(especificador)); // Muestra: 1.632.562,00%
Llegados a este punto, podríamos hablar tan profundamente y durante tanto tiempo sobre clases, objetos, métodos, atributos… que desvirtuaría el sentido de este curso. Supongo que tenéis nociones básicas de todo este paradigma de la orientación a objetos y veremos cómo implementar clases en C# con Mono.
Podríamos decir a muy grosso modo que:
En C#, las estructuras pueden tener métodos básicos para la lectura o modificación de las variables.
¿Cómo crear una clase?
Digo cómo crear y no cómo declarar una clase, porque el curso está basado en MonoDevelop y tras crear una clase con el interfaz, veremos cómo se declara en el código.
Dentro del espacio de nombres, a la izquierda de la interfaz, hacemos: clic derecho, “Añadir”, “Nuevo archivo”, “Clase vacía” e indicamos el nombre. Se nos creará un esqueleto básico de clase como el que sigue:
using System;
namespace holaMundo
{
public class persona
{
public persona ()
{
}
}
}Veamos ahora la clase un poco más rellena. Como veréis, estoy dentro del mismo espacio de nombres en el que hemos hecho los ejemplos anteriores, “holaMundo”. Incluimos: atributos, métodos para manejar los atributos, el constructor y un método de ejemplo.
using System; namespace holaMundo { public class persona { // atributos string nombre; int edad; // propiedades: métodos para manejar los atributos public string Nombre { get { return nombre; } set { nombre = value; } } public int Edad { get { return edad; } set { edad = value; } } // constructor public persona (string _nombre, int _edad) { // usamos los métodos para manejar atributos en lugar de this.nombre Nombre = _nombre; Edad = _edad; } // método para imprimir datos de la instancia public void print() { System.Console.WriteLine("Nombre: " + nombre + " - Edad: " + edad.ToString()); } } }
El otro día hablábamos de cómo se organizaba el código ejecutable dentro de los ensamblados, a los que podíamos referir dentro de nuestro proyecto de forma inmediata con Mono Develop. Imaginemos que acabamos de hacer referencia al conector de MySQL para Mono/.NET y queremos usar su funcionalidad en nuestro código. ¿Cómo se organizan los ensamblados, las clases y las funciones en el código? La herramienta básica para esta labor son los espacios de nombres.
Espacios de nombres
Los espacios de nombres o namespaces, son la forma de organizar dentro del código, las clases y funciones de cara a una funcionalidad. Están directamente relacionados con los ensamblados, ya que los ensamblados definen en sí mismos, un espacio de nombres y a su vez pueden contener una serie de ellos.
En todas las tecnologías de este tipo, existen mecanismos para proveer al usuario de métodos que permitan incorporar funcionalidades de ficheros externos. Ésto, unido a la orientación a objetos, crea un problema: cómo organizar y referenciar todas las clases (ya hablaremos de clases más profundamente), de una forma sencilla y que no dé lugar a incoherencias.
Ensamblados
Para resolver este problema, la estructura en Mono (y en .NET) los ensamblados. Éstos pueden ser tanto ejecutables (con extensión .exe), como de librería (con extensión .dll). Ambas extensiones son una herencia de las tecnologías Microsoft desde los tiempos del MS-DOS. Los ensamblados son ficheros en donde se encuentran, compiladas en su lenguaje intermedio, una serie de clases.
En la última entrega, la semana pasada, hablábamos de tipos de datos y cómo hacer referencias a variables, sin embargo, no hemos hablado todavía de ellas.
Hace 10 años nacía SharpDevelop y con él la posibilidad de poder desarrollar aplicaciones .NET para sistemas Windows en un entorno libre. Pero, ¿por qué hablamos de programas relacionados con Windows y .NET en este blog? Muy sencillo, hasta la llegada de este proyecto, para desarrollar con esta tecnología de forma más o menos efectiva hacía falta utilizar alguna de las versiones de Visual Studio.
Puesto que el poder de Microsoft en el mercado de escritorio es innegable, muchos de nosotros, nos veíamos abocados a desarrollar con esta herramienta por desgracia para todos, ya que si al pseudo-monopolio le sumas por un lado tecnología de desarrollo, por el otro el sistema operativo y encima le sumas el entorno de desarrollo… la situación es dramática.
Hace ya unos cuantos meses escribí para Linux+ un artículo sobre esto que os comento hoy, una introducción al desarrollo de aplicaciones web con Mono. Concretamente fue en el número de febrero. Ha pasado el tiempo y la editorial ha tornado sus miras hacia un entorno más abierto. Primero fue el lanzamiento de la revista en formato PDF y de distribución gratuita (antes era de papel y costaba unos cuantos euros) y ahora han lanzado un blog, llamado Revista Linux, donde irán publicando los artículos más relevantes de la revista en formato post, lo que seguro que tanto vosotros como los motores de búsqueda lo agradeceréis.

Si alguna vez habéis programado en un lenguaje de programación con sintaxis heredada de C: el mismo C, C++, Java, C#… seguro que habéis utilizado el operador postincremento, sobre todo en iteraciones for, el famoso: i++ (o equivalente). Lo que es menos frecuente es haber utilizado el operador ++i, pero si lo habéis utilizado seguro que lo habéis hecho para algo similar al anterior. La diferencia entre ambos es algo que un día me inquietó y que hoy os voy a comentar.