gentoo linux, java, software libre y otras hierbas
Nov, 11 2008 - 5:55 am

Paso de valores por valor y referencia en C# [arreglos] – 1ra parte

Cuando estamos trabajando con arreglos en C#, debemos tener en cuenta algo importante: si pasamos un arreglo entero, éste será pasado por referencia ; mientras que si pasamos uno de los elementos del arreglo, éste es pasado por valor.

Importante: Bueno, decir que el arreglo se pasa por referencia, en realidad es una manera fácil de decirlo. Lo que en verdad sucede es que ’se pasa la referencia al arreglo por valor’. Esto resulta a veces un poco difícil de entender, pero con el siguiente ejemplo, y el del próximo post quedará mucho más claro.

¿Qué quiere decir esto exactamente? Pues bien, cuando pasamos un arreglo completo a un método, TODAS las modificaciones que hagamos sobre el arreglo en dicho método se verán reflejadas en el arreglo original. Por otro lado, cuando lo que pasamos es un elemento de un arreglo, las modificaciones que hagamos sobre el elemento serán accesibles únicamente desde dicho método, por lo tanto el valor original del elemento no es modificado.

Ejemplo…


using System;
using System.Drawing;
using System.Windows.Forms;
public class PasarArreglo : Form
{
  private Button botonMostrarSalida;
  private Label labelSalida;
  public PasarArreglo()
  {
     InitializeComponent();
  }
  private void InitializeComponent()
  {
     this.botonMostrarSalida = new Button();
     this.labelSalida = new Label();
     this.SuspendLayout();
     //
     // botonMostrarSalida
     //
     this.botonMostrarSalida.Location = new System.Drawing.Point(106, 8);
     this.botonMostrarSalida.Name = "botonMostrarSalida";
     this.botonMostrarSalida.Size = new System.Drawing.Size(80, 23);
     this.botonMostrarSalida.TabIndex = 0;
     this.botonMostrarSalida.Text = "Mostrar salida";
     this.botonMostrarSalida.Click += new System.EventHandler(this.botonMostrarSalida_Click);
     //
     // labelSalida
     //
     this.labelSalida.Location = new System.Drawing.Point(8, 48);
     this.labelSalida.Name = "labelSalida";
     this.labelSalida.Size = new System.Drawing.Size(280, 184);
     this.labelSalida.TabIndex = 1;
     //
     // PasarArreglo
     //
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
     this.ClientSize = new System.Drawing.Size(292, 237);
     this.Controls.AddRange(new Control[] {
          this.labelSalida,
          this.botonMostrarSalida});
     this.Name = "PasarArreglo";
     this.Text = "Pasar Arreglo por valor y referencia";
     this.ResumeLayout(false);

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

  private void botonMostrarSalida_Click( object sender,
     System.EventArgs e )
  {
     int[] a = { 1, 2, 3, 4, 5 };

     labelSalida.Text = "Resultado de pasar un arreglo " +
        "por referencia...\n\nLos valores del arreglo original son:\n\t";

     for ( int i = 0; i < a.Length; i++ )
        labelSalida.Text += "   " + a[ i ];

     ModificarArreglo( a );   // el array es pasado por referencia

     labelSalida.Text +=
        "\n\nEl valor de los datos modificados del arreglo son:\n\t";

     // mostrar elementos del array a
     for ( int i = 0; i < a.Length; i++ )
        labelSalida.Text += "   " + a[ i ];

     labelSalida.Text += "\n\nResultado de pasar un elemento del array por valor..." +
        "\n\nvalor de a[ 3 ] (antes de ser pasado a ModificarElemento()) " + a[ 3 ];

     // elemento del array pasado por valor
     ModificarElemento( a[ 3 ] );

     labelSalida.Text +=
        "\na[ 3 ] (despues de ser pasado a ModificarElemento()): " + a[ 3 ];
  }

  // metodo que modifica el arreglo que recibe
  // (el original será modificado)
  public void ModificarArreglo( int[] b )
  {
     for ( int j = 0; j < b.Length; j++ )
        b[ j ] *= 2;
  }

  // metodo que modifica el entero recibido
  // (el original no será modificado)
  public void ModificarElemento( int e )
  {
     labelSalida.Text +=
        "\nvalor recibido por el metodo: " + e;
     e *= 2;
     labelSalida.Text +=
        "\nvalor modificado dentro del metodo: " + e;
  }
}

Descargar código fuente

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.

2 Comentarios | deja el tuyo

2 enlaces entrantes

Sin comentarios en “Paso de valores por valor y referencia en C# [arreglos] – 1ra parte”

¡Déjanos tu comentario!