Suscribirse al Feed
11Nov

Paso de valores por valor y referencia en C # [arreglos] – 2da parte

En el post anterior decíamos que cuando pasamos un arreglo a un método, 'se pasa la referencia al arreglo por valor'. En este post veremos entonces cual es la diferencia entre pasar la "referencia de un arreglo por valor" y "referencia de un arreglo por referencia".

Ejemplo...

c sharp


using System;
using System.Drawing;
using System.Windows.Forms;
public class EjemploArregloReferencia : Form
{
  private Label labelSalida;
  private Button botonMostrarSalida;
  public EjemploArregloReferencia()
  {
     InitializeComponent();
  }

  private void InitializeComponent()
  {
     this.labelSalida = new Label();
     this.botonMostrarSalida = new Button();
     this.SuspendLayout();
     //
     // labelSalida
     //
     this.labelSalida.Location = new System.Drawing.Point(10, 40);
     this.labelSalida.Name = "labelSalida";
     this.labelSalida.Size = new System.Drawing.Size(272, 280);
     this.labelSalida.TabIndex = 0;
     //
     // botonMostrarSalida
     //
     this.botonMostrarSalida.Location = new System.Drawing.Point(101, 8);
     this.botonMostrarSalida.Name = "botonMostrarSalida";
     this.botonMostrarSalida.Size = new System.Drawing.Size(91, 23);
     this.botonMostrarSalida.TabIndex = 1;
     this.botonMostrarSalida.Text = "Mostrar salida";
     this.botonMostrarSalida.Click += new System.EventHandler(this.botonMostrarSalida_Click);
     //
     // EjemploArregloReferencia
     //
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
     this.ClientSize = new System.Drawing.Size(292, 325);
     this.Controls.AddRange(new Control[] {
                                                                  this.botonMostrarSalida,
                                                                  this.labelSalida});
     this.Name = "EjemploArregloReferencia";
     this.Text = "EjemploArregloReferencia";
     this.ResumeLayout(false);

  }
  static void Main()
  {
     Application.Run( new EjemploArregloReferencia() );
  }

  private void botonMostrarSalida_Click( object sender,
     System.EventArgs e )
  {
     // crear e iniciar primerArreglo
     int[] primerArreglo = { 1, 2, 3 };

     // copiar primerArreglo en otro arreglo
     int[] copiaPrimerArreglo = primerArreglo;

     labelSalida.Text =
        "Ejemplo pasar la referencia de primerArreglo por valor";

     labelSalida.Text += "\n\nContenido de primerArreglo " +
        "antes de llamar el metodo primerDoblar:\n\t";

     // imprimir el contenido del arreglo primerArreglo
     for ( int i = 0; i < primerArreglo.Length; i++ )
        labelSalida.Text += primerArreglo[ i ] + " ";

     // pasar referencia de primerArreglo por valor a primerDoblar
     primerDoblar( primerArreglo );

     labelSalida.Text += "\n\nContenido de primerArreglo despues " +
        "de llamar el metodo primerDoblar\n\t";

     // imprimir contenido de primerArreglo
     for ( int i = 0; i < primerArreglo.Length; i++ )
        labelSalida.Text += primerArreglo[ i ] + " ";

     // probar si la copia cambio
     if ( primerArreglo == copiaPrimerArreglo )
        labelSalida.Text +=
           "\n\nLa copia fue modificada tambien (porque tiene la referencia a dicho arreglo)\n";
     else
        labelSalida.Text +=
           "\n\nLa copia no fue modificada\n";

     // crear e inciar segundoArreglo
     int[] segundoArreglo = { 1, 2, 3 };

     // crear una copia de segundoArreglo
     int[] copiaSegundoArreglo = segundoArreglo;

     labelSalida.Text += "\nEjemplo, pasar referencia de segundoArreglo " +
        "por referencia";

     labelSalida.Text += "\n\nContenido de segundoArreglo " +
        "antes de llamar el metodo segundoDoblar:\n\t";

     // imprime el contenido de segundoArreglo antes de llamar al metodo
     for ( int i = 0; i < segundoArreglo.Length; i++ )
        labelSalida.Text += segundoArreglo[ i ] + " ";

     segundoDoblar( ref segundoArreglo );

     labelSalida.Text += "\n\nContenido de segundoArreglo " +
        "despues de llamar el metodo segundoDoblar:\n\t";

     // imprimir el contenido de segundoArreglo despues de llamar al metodo
     for ( int i = 0; i < segundoArreglo.Length; i++ )
        labelSalida.Text += segundoArreglo[ i ] + " ";

     // verificar si la copia ha cambiado
     if ( segundoArreglo == copiaSegundoArreglo )
        labelSalida.Text +=
           "\n\nLa copia ha cambiado\n";
     else
        labelSalida.Text +=
           "\n\nLa referencia y el arreglo original son distintos (porque el original cambio de referencia)\n";

  } // fin del metodo botonMostrarSalida_Click

  // modifica elementos del arreglo e intentar modificar la referencia
  void primerDoblar( int[] array )
  {
     // doblar cada elemento del arreglo
     for ( int i = 0; i < array.Length; i++ )
        array[ i ] *= 2;

     // crear una nueva referencia y asignarla al arreglo
     array = new int[] { 11, 12, 13 };
  }

  // modifica elementos del arreglo e intentar modificar la referencia
  void segundoDoblar( ref int[] array )
  {
     // doblar cada elemento del arreglo
     for ( int i = 0; i < array.Length; i++ )
        array[ i ] *= 2;

     // crear una nueva referencia y asignarla al arreglo
     array = new int[] { 11, 12, 13 };
  }
}

Descargar código fuente

Enviar a Twitter
Los ejercicios utilizados en este post están basados en ejemplos del libro C# How to Program de Deitel. Se pone a disposición la descargar del programa original, desarrollado para trabajar sobre Visual Studio de Microsoft en plataformas Windows, y se encuentra en inglés. La versión simplificada está basada en la original, pero sin código basura insertado por Visual Studio, se encuentra en español y ha sido probada sobre Gnu/Linux usando Mono.

1 Comentario para “Paso de valores por valor y referencia en C # [arreglos] – 2da parte”

 

 

Antes de comentar... recuerda que no hago tareas

Te invito a subscribirte al feed RSS. ¿No sabes que es un lector de Feeds?

© 2007 - 2008 Dezinerfolio. Todos los derechos reservados.
Powered by Wordpress. Entradas RSS