domingo, 21 de diciembre de 2008

Variables al Paso

Hola a tod@s:

Bueno como muchos sabréis, en casi todos los lenguajes de programación hay dos formas de pasar las variables a funciones o procedimientos, por valor y por referencia:

  • Por valor significa que la función  recibe una copia del valor que tiene la variable.
  • Por referencia significa que se pasa la posición de memoria donde esta guardada la variable, por lo que la función puede saber cuánto vale, pero además puede modificarla de cualquier manera el valor de la variable original.

Bien en VB.NET no iba a ser menos, cuando definimos una función e indicamos sus parámetros lo hacemos mediante "ByVal" para indicarle que es un paso por valor, y con "ByRef" para indicar que es un paso por referencia.

Por ejemplo si definimos:

Private Function Duplica(ByRef a As Integer) As Integer


       a *= 2 'igual que poner a = a * 2


       Return a


End Function




El parámetro "a" se está recibiendo por referencia, lo que hace la función es duplicar el valor del parámetro y devolver el valor resultante, evidentemente este último paso sería innecesario pues al tratarse de un paso por referencia el contenido de la variable original queda modificado tras ejecutarse la llamada a la función.



Sin embargo, no hace mucho, he descubierto algo curioso en este lenguaje, y es que si cuando hacemos la llamada a una función una función que está definida para recibir los parámetro por referencia, podemos forzar a que se envíe una copia del parámetro original, esto se consigue metiendo la variable original entre paréntesis. Mejor lo vemos en un ejemplo:





   1: Module Module1


   2:  


   3:     Sub Main()


   4:         Dim a, b, c As Integer


   5:         a = 2


   6:         b = 2


   7:         c = Duplica(a) 'llamamos a la función pasando él parámetro por referencia


   8:         Console.WriteLine("a = " + a.ToString + " c = " + c.ToString)


   9:  


  10:         c = Duplica((b)) 'llamada a la función pasando el parámetro por valor


  11:         Console.WriteLine("b = " + b.ToString + " c = " + c.ToString)


  12:  


  13:         Console.ReadLine()


  14:     End Sub


  15:  


  16:     Private Function Duplica(ByRef a As Integer) As Integer


  17:         a *= 2 'igual que poner a = a * 2


  18:         Return a


  19:     End Function


  20:  


  21: End Module




En el ejemplo definimos 3 variables, a y b que tendrán un valor inicial de 2 y usaremos como parámetro para probar la función definida anteriormente, c nos servirá para almacenar el valor devuelto por la función.



Si ejecutamos el código veremos como en la llamada de la línea 7 se modifica el valor de "a" y que coincide con el valor devuelto por la función, es decir se está ejecutando el paso por referencia correctamente. Sin embargo en la llamada a la función de la línea 10, podemos comprobar por medio de este ejemplo, que el valor de b no es alterado, pero la función retorna el valor correspondiente tras su ejecución.



Es una curiosidad que quería compartir, y que si os paráis a pensarlo, tiene sentido, al encerrar la variables entre paréntesis, estamos priorizando la  evaluación de dicha variable, y lo que enviamos a la función es el resultado de dicha evaluación. Puede ser interesante si trabajamos con librerías y/o clases no desarrolladas por nosotros, o en las que no podemos modificar el código, y queremos pasarle parámetros por valor.



Espero que os sirva de algo, xD.



PD: No estoy seguro de si en C# también funciona así, aún no lo he probado.



 



Saludos.

1 comentario:

david santos dijo...

Por los que daremos gracias por pasar otra noche buena…
Por los que recordaremos las ya pasadas…
Por los que pasaran la primera…
Por los que no la podrán pasar…
Por todos ellos y muchos más…
Os deseo Feliz Noche Buena y Navidad…

Publicado por WUAPIBEGO