tengo entendido que tanto el caso 1 y el caso 2 son lo mismo ya que en el caso 1 viene implicitamente el ByRef
(Corríjanme si me equivoco)
Te corrijo: eso no es así, sino todo lo contrario.
ByVal es un simple acrónimo para referirse a un argumento que se pasa por valor (
by value), y
ByRef para referirse a uno que se pasa por referencia (
by reference). Aunque en lugar de acrónimos los llamaremos de forma global
Keywords, y la idea de como funcionan esos
keywords ya pareces tenerla clara; cuando pasamos un argumento por valor se crea una copia del objeto en la que cualquier modificación realizada en la copia no se reflejará en el objeto original.
En
VB.NET, por defecto los argumentos se pasan por valor (
ByVal), no por referencia (
ByRef); por ende, el
keyword ByVal está implícito en la firma del método del "
Caso 1", siendo exactamente idéntica a la firma del método del "
Caso 3".
Cual es la forma correcta en la que deben escribirse en las Functions?
El comportamiento de
ByVal o
ByRef se usa y afecta de la misma manera a los argumentos de un método, que los de una función.
¿Cual es la forma correcta de pasar un argumento a una función?, eso depende del propósito real que quieras llevar a cabo con la función en cuestión. En un principio el propósito de una función es ejecutar un algoritmo que resuelva un problema para al final devolver un resultado (o valor de retorno), así que generálmente no debería existir por tu parte la necesidad de pasar argumentos por referencia ...en una función.
Dicho esto, lo que si estás escribiendo de forma incorrecta son las firmas de todos esos métodos y funciones, me refiero a que solamente podrás compilar uno de esos 3 métodos/funciones, puesto que la firma de "
Caso 1" es idéntica a la de "
Caso 3" como ya expliqué, y la firma de ambos "
Caso 1" y "
Caso 3" toman un argumento del mismo data-type que la de "
Caso 2" (
Integer), pero éste necesariamente ha de diferenciarse en algo más que en el mecanismo de paso (
ByVal/
ByRef).
Aparte de eso, esta suma:
valorA = valorA + 1
La puedes simplificar a:
valorA += 1
Y por último decirte que ya existe una función que toma un valor entero por referencia, lo incrementa en 1 y devuelve el resultado:
System.Threading.Interlocked.Increment() , y otra para disminuir un valor entero:
System.Threading.Interlocked.Decrement() . Esto son consideradas funciones especiales por así decirlo, ya que su utilización es más que nada para simplificar código al evitar órdenes individuales para sumar variables que se usan como contador, de hecho resulta más rápido que realizar una incrementación individual y son funciones
thread-safe.
Probablemente no encontrarás ninguna otra función definida en la librería de clases de
.NET Framework que tome un argumento por referencia, puesto que como ya expliqué, generálmente no debería existir la necesidad de hacerlo en una función; un caso en el que sería productivo pasar un argumento por referencia sería que tu función usase el argumento para almacenar el resultado, y utilizase el valor de retorno para poder depurar el estado de la operación efectuada (éxito/error) como se puede ver en las funciones de la API de Windows.
Saludos