Postupy: Ochrana argumentu procedury proti změnám hodnoty (Visual Basic)
Pokud procedura deklaruje parametr jako ByRef, visual Basic poskytuje kód procedury přímý odkaz na programovací prvek, který je základem argumentu ve volajícím kódu. To umožňuje, aby procedura změnila hodnotu, která je základem argumentu ve volajícím kódu. V některýchpřípadechch
Argument můžete vždy chránit před změnou deklarací odpovídajícího parametru ByVal v postupu. Pokud chcete mít možnost změnit daný argument v některých případech, ale ne jiné, můžete ho ByRef
deklarovat a nechat volající kód určit předávací mechanismus v každém volání. Provede to tak, že do závorek uzavřete odpovídající argument, který ho předá hodnotou, nebo ho neuzavřete do závorek a předáte ho odkazem. Další informace naleznete v tématu Postupy: Vynucení předání argumentu hodnotou.
Příklad
Následující příklad ukazuje dva postupy, které přebírají proměnnou pole a pracují s jeho prvky. Procedura increase
jednoduše přidá jeden do každého prvku. Procedura replace
přiřadí parametru a()
nové pole a pak přidá jedno do každého prvku. Opětovné přiřazení však nemá vliv na podkladovou proměnnou pole ve volajícím kódu.
Public Sub increase(ByVal a() As Long)
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Public Sub replace(ByVal a() As Long)
Dim k() As Long = {100, 200, 300}
a = k
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
První MsgBox
volání zobrazí "Po zvýšení(n): 11, 21, 31, 41". Vzhledem k tomu, že pole n
je referenčním typem, increase
může změnit jeho členy, i když je mechanismus ByVal
předávání .
Druhé MsgBox
volání zobrazí "Po nahrazení(n): 11, 21, 31, 41". Protože n
je předán ByVal
, replace
nelze upravit proměnnou n
ve volajícím kódu přiřazením nového pole. Když replace
vytvoří novou instanci k
pole a přiřadí ji k místní proměnné a
, ztratí odkaz n
předávaný volajícím kódem. Když změní členy a
, bude ovlivněn pouze místní pole k
. replace
Proto nezvýšuje hodnoty pole n
ve volajícím kódu.
Kompilace kódu
Výchozí hodnota v jazyce Visual Basic je předání argumentů podle hodnoty. Je však vhodné programování zahrnout klíčové slovo ByVal nebo ByRef s každým deklarovaným parametrem. Díky tomu se kód snadněji čte.
Viz také
- Procedury
- Parametry a argumenty procedury
- Postupy: Předání argumentů proceduře
- Předávání argumentů podle hodnoty a reference
- Rozdíly mezi upravitelnými a neupravitelnými argumenty
- Rozdíly mezi předáním argumentu podle hodnoty a podle reference
- Postupy: Změna hodnoty argumentu procedury
- Postupy: Vynucení předání argumentu podle hodnoty
- Předávání argumentů podle pozice a názvu
- Typy hodnot a odkazové typy