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.