Parámetros por valor y por referencia

Existen dos formas de pasar parámetros a un procedimiento o función: por valor o por referencia. Al pasar un parámetro por valor, tal como su nombre lo indica, lo que le estamos pasando al subprograma es el valor de la variable, es decir, que el subprograma recibe una copia de la variable original con el valor de ella. Al pasar un parámetro por referencia, lo que se le pasa al subprograma es la dirección de memoria donde se encuentra el valor de la variable. Es decir, se le pasa una referencia al valor. Dado que se pasa la dirección de memoria donde se encuentra el valor, cualquier asignación que se le haga al parámetro se efectuará en realidad sobre la variable original, ya que se escribe en la misma dirección de memoria.
Muchos lenguajes de programación (entre ellos Visual Basic .Net) no tienen el concepto de parámetro de salida como parte del lenguaje, por lo que es necesario utilizar parámetros por referencia para devolver un valor al programa o subprograma que hizo la llamada.


¡CUIDADO CON LAS VARIABLES GLOBALES!
Muchas veces las variables globales son tentadoras, porque evitan la necesidad de pasar parámetros de un subprograma a otro para utilizar el valor de una variable. Sin embargo, en la práctica, el uso indiscriminado de variables globales no es recomendado porque dificulta el mantenimiento del programa, dado que es difícil determinar en qué momento una variable global recibió algún valor.

Procedimientos y funciones en C# y Visual Basic .Net

Obviamente, los dos lenguajes de .Net provistos por Microsoft proveen mecanismos para definir subprogramas.

En C#, el concepto de procedimiento no existe como tal, sino que todo son funciones. Sin embargo, es posible definir procedimientos como funciones que no devuelven un resultado, utilizando el tipo de dato void (que es un tipo de datos nulo). En Visual Basic .Net, los procedimientos se definen mediante la palabra clave Sub. Veámoslo con ejemplos.

// C#
void HolaMundo()
{
      Console.WriteLine(“Hola Mundo”);
}

‘ VB.Net
Sub HolaMundo()
      Console.WriteLine(“Hola Mundo”)
End Sub

En el caso de C#, el procedimiento (que en realidad es una función) comienza con el tipo de dato devuelto, void, seguido del nombre del procedimiento con la lista de parámetros entre paréntesis (que en el ejemplo está vacía). La secuencia de sentencias que compone el procedimiento en C# está delimitado por las llaves de apertura y cierre (los caracteres { y }). Por otro lado, en VB.Net, la definición del procedimiento comienza con la palabra clave Sub, seguida del nombre del procedimiento y la lista de parámetros. A diferencia de C#, en Visual Basic .Net no se utilizan caracteres para marcar el comienzo de las sentencias del procedimiento, pero sí se utiliza End Sub para marcar el fin.

La forma de definir una función en C# es igual que en el ejemplo anterior, reemplazando la palabra void por el tipo de dato que se necesite devolver (por ejemplo, int para enteros). En VB.Net, la definición de una función es sustancialmente diferente, ya que debe utilizarse la palabra reservada Function en lugar de Sub, y se le agrega al final el tipo de dato de salida. Además, como con los procedimientos, en VB.Net hay que marcar el fin de la función con End Function. Como requisito extra, en ambos lenguajes es obligatorio colocar la palabra return para devolver el resultado de la función.

// C#
int Sumar(int a, int b)
{
      return a + b;
}

‘ VB.Net
Function Sumar(a, b as Integer) As Integer
      Return a + b
End Function

LAS DLLS EN WINDOWS
El sistema operativo Windows está formado por unas cuantas decenas de DLLs. Un detalle interesante sobre esto es que esas DLLs poseen las funciones y procedimientos que Windows utiliza para hacer todo lo que hace, y están lo suficientemente documentadas como para que podamos utilizarlas en nuestros programas cuando necesitemos hacer algo que el lenguaje no tiene previsto. Este conjunto de DLLs se denomina API ( Application Programmer Interface o Interfaz para el programador de aplicaciones).