62 - Parámetros por referencia (ref)


Hasta ahora habíamos visto que podemos pasar datos a un método para que sean utilizados en el mismo. Si queremos que un método retorne más de un dato es común utilizar los parámetros por referencia.

La idea central es pasar a un método las direcciones de las variables para que el método pueda modificar los datos de las variables pasadas.

Problema 1:

Implementar un método que se le envíen dos variables y nos devuelvan sus contenidos intercambiados.

Programa:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ParametrosReferencia1
{
    class Program
    {
        public void Intercambiar(ref int valor1, ref int valor2)
        {
            int aux = valor1;
            valor1 = valor2;
            valor2 = aux;
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            int x1 = 10;
            int x2 = 20;
            Console.WriteLine("Los valores antes de intercambiar son " + x1 + " " + x2);
            p.Intercambiar(ref x1, ref x2);
            Console.WriteLine("Los valores después de intercambiar son " + x1 + " " + x2);
            Console.ReadKey();
        }
    }
}

Para indicar que un parámetro es por referencia debemos anteceder la palabra clave "ref":


        public void Intercambiar(ref int valor1, ref int valor2)

El objetivo fundamental de un parámetro por referencia es modificar su contenido dentro del método (asignamos valor2 a valor1 y en valor2 almacenamos el contenido de valor1):


            int aux = valor1;
            valor1 = valor2;
            valor2 = aux;

Cuando llamamos a un método que tiene uno o más parámetros por referencia debemos anteceder la palabra ref previo a la variable:

            p.Intercambiar(ref x1, ref x2);

Siempre que llamamos a un método que recibe un parámetro por referencia debe estar inicializada la variable que le pasamos:


            int x1 = 10;
            int x2 = 20;
            Console.WriteLine("Los valores antes de intercambiar son " + x1 + " " + x2);
            p.Intercambiar(ref x1, ref x2);

Problema propuesto

  1. Confeccionar un método que reciba por referencia tres enteros y nos los retorne en forma ordenada de menor a mayor.
Solución
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ParametrosReferencia2
{
    class Program
    {
        public void Ordenados(ref int v1, ref int v2, ref int v3)
        {
            int menor;
            int intermedio;
            int mayor;
            if (v1 <= v2 & v1 <= v3)
            {
                menor = v1;
                if (v2 < v3)
                {
                    intermedio = v2;
                    mayor = v3;
                }
                else
                {
                    intermedio = v3;
                    mayor = v2;
                }
            }
            else
            {
                if (v2 <= v3)
                {
                    menor = v2;
                    if (v1 < v3)
                    {
                        intermedio = v1;
                        mayor = v3;
                    }
                    else
                    {
                        intermedio = v3;
                        mayor = v1;
                    }
                }
                else
                {
                    menor = v3;
                    if (v1 < v2)
                    {
                        intermedio = v1;
                        mayor = v2;
                    }
                    else
                    {
                        intermedio = v2;
                        mayor = v1;
                    }
                }
            }
            v1 = menor;
            v2 = intermedio;
            v3 = mayor;
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            Console.Write("Ingrese primer valor:");
            int x1=int.Parse(Console.ReadLine());
            Console.Write("Ingrese segundo valor:");
            int x2 = int.Parse(Console.ReadLine());
            Console.Write("Ingrese primer valor:");
            int x3 = int.Parse(Console.ReadLine());
            p.Ordenados(ref x1, ref x2, ref x3);
            Console.WriteLine("Los valores ordenados de menor a mayor:");
            Console.WriteLine(x1 + " " + x2 + " " + x3);
            Console.ReadKey();
        }
    }
}


Retornar