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...

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 };
}
}








