Curso C# con Mono – Tipos de datos y uso de referencias

Seguimos el curso de C# con Mono profundizando algo más en el lenguaje. Si la semana pasada hablábamos de cómo poner todo en marcha y ejecutar el típico ¡Hola Mundo! esta semana veremos cómo tratar con condicionales, iteradores y operadores.

La idea de este curso no es hablar de qué es una iteración, ni siquiera profundizar en los aspectos más detallados del uso; sino dar unos conceptos breves pero importantes, para que podáis profundizar vosotros mismos.

Introducción

Al igual que en todos los lenguajes en C# existen los tipos de datos. Se tratan de una forma muy similar a Java y como nota destacable sólo comentaré que:

  • El carácter por defecto, char, es UNICODE. Es decir no ocupa 8 bits, sino 16, y puede manejar todo tipo de símbolos (acentos, eñes, etc) por defecto.
  • Si vienes de C y buscas utilizar enteros: 0 y distinto de 0 (falso o verdadero), el tipo bool es la herramienta para hacerlo.
  • Además de los tipos de datos de C# al completo, siempre podrás almacenar en variables referencias a objetos, vectores, etc. o incluso a tipos de datos básicos.

Para pasar referencias a funciones de tipos de datos básicos usamos las palabra claves out y ref (ahora veremos el uso de ambas). Esta es una diferencia relevante con Java, donde las variables de tipos de datos básicos se pasan siempre por valor.

Dualidad objeto/tipo de dato

Al igual que ocurre en Java, los tipos de datos básicos corresponden en realidad a clases. Por ejemplo, el tipo de dato float es en realidad una abreviatura para instanciar la clase System.Single.

Veamos un ejemplo:

float a;
System.Single b = new System.Single();

Estamos declarando, dos variables para almacenar valores en punto flotante de precisión simple de formas. La variable a la declaramos al estilo C y la variable b en realidad representa a una instancia de la clase System.Single.

Si dentro de los using tenemos declarado el espacio de nombres System, se puede hacer directamente: Single b = new Single().

Utilización del parámetro out

Veamos directamente sobre un ejemplo el uso del parámetro out. Inicializaremos dos variables a 0, llamaremos a una función donde variaremos su valor. Tras la asignación volvemos a leer el valor de las variables y comprobamos que han cambiado.

Veamos el código:

public static void Main (string[] args)
{
	int a = 0;
	int b = 0;

	Console.WriteLine("Valor de: a = {0}, b = {1}
        antes de llamar a la función", a, b); 

	probarOut(out a,out b);

	Console.WriteLine("Valor de: a = {0}, b = {1}
        tras llamar a la función", a, b);
}

public static void probarOut(out int a, out int b)
{
	a = 100;
	b = 200;
}

Dentro de la función probarOut no hemos intentado leer las variables porque no sería posible. Si queremos hacerlo, de forma similar a lo que haríamos con & en C, debemos usar ref.

El parámetro out se usa en algunas funciones de conversión de datos, por ejemplo, TryParse.

Utilización del parámetro ref

Para terminar con este artículo, veremos el uso de la palabra reservada ref. Haremos una función que intercambie el valor de dos enteros. Previamente los inicializaremos, los imprimimos por pantalla y tras comprobar la llamada a la función, volvemos a imprimir por pantalla para comprobar que su valor ha cambiado.

Veamos el código:

public static void Main (string[] args)
{
	int a = 1;
	int b = 2;

	Console.WriteLine("Valor de: a = {0}, b = {1}
        antes de llamar a la función", a, b); 

	intercambiar(ref a, ref b);

	Console.WriteLine("Valor de: a = {0}, b = {1}
        tras llamar a la función", a, b);
}

public static void intercambiar(ref int a, ref int b)
{
	int tmp = b;
	b = a;
	a = tmp;
}

Como veréis, los mecanismos de referencias en C# son mucho más naturales que en Java. Si queremos pasar una referencia de un tipo de dato básico en Java, debemos usar mecanismos como las llamadas: AtomicReference.

Ya sabéis que cuando se trata de objetos que no son tipos de datos básicos, no hay problema.

Entregas previas:

Author Description

F. Javier Carazo Gil

Casi Ingeniero Informático, co-fundador y administrador de Linux Hispano, además de desarrollar software y mantener sistemas en el CSIC, hace poco he fundado junto con Alberto Hornero una start-up: CODECTION donde trabajamos con software libre. Puedes saber más sobre mí, mi vida laboral, mis libros, mis artículos y mi día a día en @fjcarazo y en mi perfil público de LinkedIn.

  • Pingback: Bitacoras.com

  • Pingback: Curso C# con Mono – ¡Hola Mundo! | Linux Hispano

  • Pingback: Curso C# con Mono – Variables y constantes | Linux Hispano

  • Pingback: Curso C# con Mono – Variables y constantes | Superlinux

  • Pingback: Curso C# con Mono – Ensamblados | Superlinux

  • Pingback: Curso C# con Mono – Herencia | Linux Hispano

  • zoft

    Explicar que el método WriteConsole tiene en este caso 3 parámetros, el primero indicando el formato de lo que se va a escribir y luego una lista de parámetros que ocuparán su sitio en la línea según se indica en el formato (0, 1, …).

  • http://www.jcarazo.com carazo

    @zoft: Gracias por la aclaración.

    Otra opción sería la siguiente:
    Console.WriteLine(“Valor de: a = ” + a.ToString() + “, b = ” + b.ToString() + ” tras llamar a la función”);

  • Alex

    Disculpa para que es el “tmp” o que significa?