Postupy: Změna hodnoty argumentu procedury (Visual Basic)
Při volání procedury odpovídá každý zadaný argument jednomu z parametrů definovaných v postupu. V některých případech může kód procedury změnit hodnotu, která je základem argumentu ve volajícím kódu. V jiných případech může procedura změnit pouze místní kopii argumentu.
Při volání procedury Visual Basic vytvoří místní kopii každého argumentu, který je předán ByVal. Pro každý argument předaný ByRef, Visual Basic poskytuje kód procedury přímý odkaz na programovací prvek podklad argumentu ve volajícím kódu.
Pokud základní prvek ve volajícím kódu je upravitelný prvek a argument je předán ByRef
, kód procedury může použít přímý odkaz na změnu hodnoty elementu ve volajícím kódu.
Změna podkladové hodnoty
Změna základní hodnoty argumentu procedury ve volajícím kódu
V deklaraci procedury zadejte ByRef pro parametr odpovídající argumentu.
Ve volajícím kódu předejte jako argument upravitelný programovací prvek.
V volajícím kódu nezavřete argument do závorek v seznamu argumentů.
V kódu procedury použijte název parametru k přiřazení hodnoty k podkladovému prvku ve volajícím kódu.
Podívejte se na příklad níže pro ukázku.
Změna místních kopií
Pokud základní prvek ve volajícím kódu je nemodifovatelný prvek, nebo pokud je argument předán ByVal
, procedura nemůže změnit jeho hodnotu ve volajícím kódu. Tento postup však může změnit místní kopii takového argumentu.
Změna kopie argumentu procedury v kódu procedury
V deklaraci procedury zadejte ByVal pro parametr odpovídající argumentu.
nebo
V volajícím kódu uzavřete argument do závorek v seznamu argumentů. Tím vynutíte, aby jazyk Visual Basic předal argument podle hodnoty, i když odpovídající parametr určuje
ByRef
.V kódu procedury použijte název parametru k přiřazení hodnoty k místní kopii argumentu. Podkladová hodnota ve volajícím kódu se nezmění.
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.
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(ByRef 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, replace
může změnit jeho členy, i když je mechanismus ByVal
předávání .
Druhé MsgBox
volání zobrazí "Po nahrazení(n): 101, 201, 301". Protože n
je předán ByRef
, replace
může upravit proměnnou n
ve volajícím kódu a přiřadit mu nové pole. Vzhledem k tomu n
, že jde o typ odkazu, replace
může také změnit jeho členy.
Můžete zabránit tomu, aby procedura upravovala samotnou proměnnou ve volajícím kódu. Viz Postupy: Ochrana argumentu procedury před změnami hodnoty.
Kompilace kódu
Když předáte proměnnou odkazem, musíte k určení tohoto mechanismu použít ByRef
klíčové slovo.
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.
Zabezpečení rozhraní .NET Framework
Existuje vždy potenciální riziko, že procedura může změnit hodnotu podkladového argumentu ve volajícím kódu. Před použitím této hodnoty se ujistěte, že se má tato hodnota změnit, a připravte se na jeho platnost.
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: Ochrana argumentu procedury před změnami hodnoty
- Postupy: Vynucení předání argumentu podle hodnoty
- Předávání argumentů podle pozice a názvu
- Typy hodnot a odkazové typy