visual sub net funciones ejemplos function vb.net-2010

funciones - vb net sub function



Diferencia entre ByVal y ByRef? (8)

¿Cuál es la diferencia? Siempre uso ByVal, pero no tengo una buena idea de cuándo debería y cuándo no ...


ByRef = Le das a tu amigo tu trabajo final (el original), lo marca y puede devolvértelo.

ByVal = Le das a hime una copia del papel del término y él te devuelve los cambios, pero debes volver a ponerlos en el original.

Tan simple como puedo hacerlo.

Por qué usar Byref:
ByRef pasará el PUNTERO al objeto que está pasando. Si está en el mismo espacio de memoria, esto significa pasar solo la ''palabra'' y no el objeto. El método al que se lo está pasando puede hacer cambios en el objeto original y no es necesario devolverlos, ya que están en el objeto original. Útil para hacer pases de datos grandes más rápido. También puede usar ByRef para permitir el uso de un SUB en lugar de una FUNCIÓN (en VB), ya que no necesita devolver el objeto.

¿Por qué no usar Byref?
Dado que el método tiene acceso al original, cualquier cambio realizado será inmediato y permanente. Si el método falla, el objeto podría estar dañado. El uso de ByVal hará una copia, pasará la copia completa al método, y luego el método procesará la información y volverá a devolver una copia, informará la información o no hará nada.


ByRef, un valor tendrá 2 direcciones

Entonces, si x = 80 (80 es valor y x es dirección, entonces, por ejemplo, la variable y también puede ser 80 y, por lo tanto, se puede acceder a 80 mediante x e y)


Espero que esto responda tu pregunta

Sub last_column_process() Dim last_column As Integer last_column = 234 MsgBox last_column trying_byref x:=last_column MsgBox last_column trying_byval v:=last_column MsgBox last_column End Sub Sub trying_byref(ByRef x) x = 345 End Sub Sub trying_byval(ByRef v) v = 555 End Sub


Las respuestas de @Tom y @kelloti son útiles. Aquí hay un ejemplo de código para ilustrar más a fondo:

Private Function ValMessage(ByVal SomeMessage As String) SomeMessage = "Val Val Val" '' <-- this variable modification doesn''t persist after the function finishes execution ValMessage = "Some Return Value" End Function Private Function RefMessage(ByRef SomeMessage As String) SomeMessage = "Ref Ref Ref" '' <-- this variable modification persists even after the function finishes execution RefMessage = "Some Return Value" End Function Private Sub DoStuff() Dim OriginalMessage As String Dim OtherMessage As String Dim AnotherMessage As String OriginalMessage = "Original" MsgBox ("ORIGINAL: " & OriginalMessage) ''--> "Original" OtherMessage = ValMessage(OriginalMessage) MsgBox ("ORIGINAL: " & OriginalMessage) ''--> "Original" AnotherMessage = RefMessage(OriginalMessage) MsgBox ("ORIGINAL: " & OriginalMessage) ''--> "Ref Ref Ref" <--- this is the difference when you pass a paramter by reference End Sub


Piensa que puede haber un error tipográfico en la última muestra: el último sub debe ser "byval" y no "byref". :)

También se agregó una declaración msgbox en trying_byval para que pueda entender lo que significa.

Sub begin() Dim last_column As Integer last_column = 234 MsgBox "Begin:" & last_column trying_byref x:=last_column MsgBox "byref:" & last_column trying_byval v:=last_column MsgBox "byval:" & last_column End Sub Sub trying_byref(ByRef x) x = 111 End Sub Sub trying_byval(ByVal v) ''<--not ByRef, that was in sub trying_byref. v = 222 MsgBox "In Here:" & v End Sub


Sé que esta pregunta ya ha sido contestada, pero solo quería agregar lo siguiente ...

El objeto que pasa a una función está sujeto a ByRef / ByVal, sin embargo, si ese objeto contiene referencias a otros objetos, pueden ser modificados por el método llamado independientemente de ByRef / ByVal. Mala explicación, lo sé, vea el código a continuación para una mejor comprensión:

Public Sub Test() Dim testCase As List(Of String) = GetNewList() ByRefChange1(testCase) ''testCase = Nothing testCase = GetNewList() ByValChange1(testCase) ''testCase is unchanged testCase = GetNewList() ByRefChange2(testCase) ''testCase contains the element "ByRef Change 2" testCase = GetNewList() ByValChange2(testCase) ''testCase contains the element "ByVal Change 2" End Sub Public Function GetNewList() As List(Of String) Dim result As List(Of String) = New List(Of String) result.Add("Value A") result.Add("Value B") result.Add("Value C") Return result End Function Public Sub ByRefChange1(ByRef aList As List(Of String)) aList = Nothing End Sub Public Sub ByValChange1(ByVal aList As List(Of String)) aList = Nothing End Sub Public Sub ByRefChange2(ByRef aList As List(Of String)) aList.Add("ByRef Change 2") End Sub Public Sub ByValChange2(ByVal aList As List(Of String)) aList.Add("ByVal Change 2") End Sub

EDITAR:

También, considere si esta función fue llamada:

Public Sub ByValChange3(ByVal aList As List(Of String)) aList.Add("ByVal Change 3") aList = New List(Of String) aList.Add("ByVal Change 4") End Sub

Lo que sucede en este caso es que "ByVal Change 3" se agrega a la lista de personas que llaman, pero en el punto que especifique que "aList = New List" está apuntando la nueva referencia a un nuevo objeto y se desconecta de las personas que llaman. lista. Ambos tienen sentido común y pueden atraparlo algún día, así que hay que tenerlo en cuenta.


Si pasa una referencia, cuando modifique el valor en el método, la variable en el sitio de la llamada también se modificará.

Si pasa un valor, es lo mismo que si se creara otra variable en el método, por lo que incluso si la modifica, no se cambiará su valor a la variable original (en el sitio de la llamada).

Entonces, de hecho, normalmente deberías pasar variables como valor. Solo pase como referencia si tiene una necesidad explícita de hacerlo.


ByRef es como un segundo valor de retorno. Pasa una referencia al objeto en la función en lugar del objeto en sí. Si cambia el valor de un parámetro ByRef en la función, verá esos cambios después de que la función termine. Si eso no fue lo suficientemente claro, lee esto y this .