63 - Parámetros por referencia (out)


Existe una segunda forma de implementar parámetros por referencia utilizando la palabra clave out. La diferencia es que las variables que le pasamos al método no requieren que estén inicializadas.

Problema 1:

Implementar un programa que permita crear, cargar y obtener el menor y mayor valor de un vector. La obtención del mayor y menor hacerlo en un único método que retorne dichos dos valores.

Programa:

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

namespace ParametrosReferencia3
{
    class Program
    {
        private int[] vec;

        public Program()
        {
            Console.Write("Tamaño del vector:");
            int tam = int.Parse(Console.ReadLine());
            vec = new int[tam];
        }

        public void Cargar()
        {
            for (var f = 0; f < vec.Length; f++)
            {
                Console.Write("Ingrese elemento:");
                vec[f] = int.Parse(Console.ReadLine());
            }
        }

        public void MayorMenor(out int may,out int men)
        {
            may=vec[0];
            men=vec[0];
            for (var f = 1; f < vec.Length; f++)
            {
                if (vec[f] > may)
                {
                    may = vec[f];
                }
                else
                {
                    if (vec[f] < men)
                    {
                        men = vec[f];
                    }
                }
            }
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            p.Cargar();
            int ma, me;
            p.MayorMenor(out ma, out me);
            Console.WriteLine("El mayor elemento del vector es:" + ma);
            Console.WriteLine("El menor elemento del vector es:" + me);
            Console.ReadKey();
        }
    }
}

Para definir un parámetro por referencia que no requiere que la variable que le enviemos esté inicializada le antecedemos la palabra clave out:

        public void MayorMenor(out int may,out int men)
        {
            may=vec[0];
            men=vec[0];
            for (var f = 1; f < vec.Length; f++)
            {
                if (vec[f] > may)
                {
                    may = vec[f];
                }
                else
                {
                    if (vec[f] < men)
                    {
                        men = vec[f];
                    }
                }
            }
        }

Lo mismo cuando llamamos al método debemos anteceder las variables que le pasamos con la palabra clave out:


            int ma, me;
            p.MayorMenor(out ma, out me);

Como podemos ver las variables ma y me no tienen un valor previo a la llamada al método MayorMenor.

Problema propuesto

  1. Confeccionar un método que me retorne dos valores aleatorios comprendidos entre 1 y 100 mediante parámetros por referencia.
Solución
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ParametrosReferencia4
{
    class Program
    {
        public void DosValoresAleatorios(out int v1, out int v2)
        {
            Random r = new Random();
            v1 = r.Next(1, 101);
            v2 = r.Next(1, 101);            
        }

        static void Main(string[] args)
        {
            int ale1, ale2;
            Program p = new Program();
            p.DosValoresAleatorios(out ale1, out ale2);
            Console.WriteLine("Primer valor aleatorio:" + ale1);
            Console.WriteLine("Segundo valor aleatorio:" + ale2);
            Console.ReadKey();
        }
    }
}

Retornar