elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Duda: Diferencias entre ByVal y ByRef en vb.net
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda: Diferencias entre ByVal y ByRef en vb.net  (Leído 5,403 veces)
OscarCadenas_91

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Duda: Diferencias entre ByVal y ByRef en vb.net
« en: 25 Junio 2016, 07:55 am »

hola estoy regresando despues de algun tiempo y me surge la siguiente duda cuando o cómo  se deben usar al pasar parametros  o argumentos a una subrutina o a una funcion.

Que diferencias hay en usar:
Código
  1. 'Caso 1
  2. Private Sub Incrementar(valorA As Integer)
  3.    valorA  = valorA +1
  4. End Sub
  5. 'Caso 2
  6. Private Sub Incrementar(ByRef valorA As Integer)
  7.    valorA  = valorA +1
  8. End Sub
  9. 'Caso 3
  10. Private Sub Incrementar(ByVal valorA As Integer)
  11.    valorA  = valorA +1
  12. End Sub
  13.  

Por lo que lei... tengo entendido que  pasar  argumento tipo ByVal crea una copia de la variable original, por lo que cualquier modificación hecha a dicha variable no afectará a la variable original y cuando se usa el  argumento tipo ByRef hace una referencia de la variable original, por lo que cualquier modificación hecha a dicha variable si afectará a la variable original.
Y ademas 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)

Mis dudas que me surgen son:

Esto pasa de igual forma en una Funcion que retorne algun valor(Es necesario indicarle el tipo de Argumento)
como ejemplo:
Código
  1. Private Function Incrementar(valorA As Integer) as Integer
  2. valorA  = valorA +1
  3. Return valorA  
  4. End Function
  5. Private Function Incrementar(ByVal valorA As Integer) as Integer
  6.  
  7. valorA = valorA +1
  8. Return valorA  
  9. End Function
  10. Private Function Incrementar(ByRef valorA As Integer) as Integer
  11. valorA  = valorA +1
  12. Return valorA  
  13. End Function
  14.  


Cual es la forma correcta en la que deben escribirse en las Functions?



En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Duda: Diferencias entre ByVal y ByRef en vb.net
« Respuesta #1 en: 25 Junio 2016, 08:56 am »

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:
Código
  1. valorA = valorA + 1

La puedes simplificar a:
Código
  1. 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


« Última modificación: 25 Junio 2016, 09:17 am por Eleкtro » En línea



OscarCadenas_91

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Re: Duda: Diferencias entre ByVal y ByRef en vb.net
« Respuesta #2 en: 26 Junio 2016, 03:10 am »

gracias Elektro. ahora si me quedo todo claro
 muchas gracias por tomarte tiempo en responder.
 
saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines