AnteriorPosterior

5.7. Modificando parámetros

  Curso: Programación en C# (2015), por Nacho Cabanes

5.7. Modificando parámetros

Podemos modificar el valor de un dato que recibamos como parámetro, pero posiblemente el resultado no será el que esperamos. Vamos a verlo con un ejemplo:

// Ejemplo_05_07a.cs
// Modificar una variable recibida como parámetro - acercamiento
// Introducción a C#, por Nacho Cabanes
 
using System;
 
public class Ejemplo_05_07a
{
 
    public static void Duplicar(int x) 
    {
        Console.WriteLine("  El valor recibido vale {0}", x);
        x = x * 2;
        Console.WriteLine("  y ahora vale {0}", x);
    }
 
    public static void Main()
    {
        int n = 5;
        Console.WriteLine("n vale {0}", n);
        Duplicar(n);
        Console.WriteLine("Ahora n vale {0}", n);
    }
 
}
 

El resultado de este programa será:

n vale 5
  El valor recibido vale 5
  y ahora vale 10
Ahora n vale 5
 

Vemos que al salir de la función, no se conservan los cambios que hagamos a esa variable que se ha recibido como parámetro.

Esto se debe a que, si no indicamos otra cosa, los parámetros "se pasan por valor", es decir, la función no recibe los datos originales, sino una copia de ellos. Si modificamos algo, estamos cambiando una copia de los datos originales, no dichos datos.

Si queremos que las modificaciones se conserven, basta con hacer un pequeño cambio: indicar que la variable se va a pasar "por referencia", lo que se indica usando la palabra "ref", tanto en la declaración de la función como en la llamada, así:

// Ejemplo_05_07b.cs
// Modificar una variable recibida como parámetro - correcto
// Introducción a C#, por Nacho Cabanes
 
using System;
 
public class Ejemplo_05_07b
{
 
    public static void Duplicar(ref int x) 
    {
        Console.WriteLine("  El valor recibido vale {0}", x);
        x = x * 2;
        Console.WriteLine("  y ahora vale {0}", x);
    }
 
    public static void Main()
    {
        int n = 5;
        Console.WriteLine("n vale {0}", n);
        Duplicar(ref n);
        Console.WriteLine("Ahora n vale {0}", n);
    }
 
}
 

En este caso sí se modifica la variable n:

n vale 5
  El valor recibido vale 5
  y ahora vale 10
Ahora n vale 10
 

El hecho de poder modificar valores que se reciban como parámetros abre una posibilidad que no se podría conseguir de otra forma: con "return" sólo se puede devolver un valor de una función, pero con parámetros pasados por referencia podríamos devolver más de un dato. Por ejemplo, podríamos crear una función que intercambiara los valores de dos variables:

public static void intercambia(ref int x, ref int y)

La posibilidad de pasar parámetros por valor y por referencia existe en la mayoría de lenguajes de programación. En el caso de C# existe alguna posibilidad adicional que no existe en otros lenguajes, como los "parámetros de salida". No podemos llamar a una función que tenga parámetros por referencia si los parámetros no tienen valor inicial. Por ejemplo, una función que devuelva la primera y segunda letra de una frase sería así:

// Ejemplo_05_07c.cs
// Parámetros "out"
// Introducción a C#, por Nacho Cabanes
 
using System;
 
public class Ejemplo_05_07c
{
 
    public static void DosPrimerasLetras(string cadena, 
        out char l1, out char l2) 
    {
        l1 = cadena[0];
        l2 = cadena[1];
    }
 
    public static void Main()
    {
        char letra1, letra2;
        DosPrimerasLetras("Nacho", out letra1, out letra2);
        Console.WriteLine("Las dos primeras letras son {0} y {1}", 
            letra1, letra2);
    }
 
}
 

Si pruebas este ejemplo, verás que no compila si cambias "out" por "ref", a no ser que des valores iniciales a "letra1" y "letra2".

Ejercicios propuestos:

Ejercicio propuesto 5.7.1: Crea una función "Intercambiar", que intercambie el valor de los dos números enteros que se le indiquen como parámetro. Crea también un programa que la pruebe.
Ejercicio propuesto 5.7.2: Crea una función "Iniciales", que reciba una cadena como "Nacho Cabanes" y devuelva las letras N y C (primera letra, y letra situada tras el primer espacio), usando parámetros por referencia. Crea un "Main" que te permita comprobar que funciona correctamente.

Actualizado el: 17-12-2014 00:19

AnteriorPosterior