Gör så här: Skydda ett procedurargument mot värdeändringar (Visual Basic)
Om en procedur deklarerar en parameter som ByRef ger Visual Basic procedurkoden en direkt referens till programmeringselementet som ligger bakom argumentet i den anropande koden. Detta gör att proceduren kan ändra värdet som ligger till grund för argumentet i den anropande koden. I vissa fall kanske anropskoden vill skydda mot en sådan ändring.
Du kan alltid skydda ett argument från att ändras genom att deklarera motsvarande parameter ByVal i proceduren. Om du vill kunna ändra ett visst argument i vissa fall, men inte andra, kan du deklarera det ByRef
och låta anropskoden fastställa överföringsmekanismen i varje anrop. Det gör det genom att omsluta motsvarande argument i parenteser för att skicka det efter värde, eller inte omsluta det i parenteser för att skicka det med referens. Mer information finns i How to: Force an Argument to Be Passed by Value (Tvinga ett argument att skickas av värde).
Exempel
I följande exempel visas två procedurer som tar en matrisvariabel och fungerar på dess element. Proceduren increase
lägger helt enkelt till en i varje element. Proceduren replace
tilldelar en ny matris till parametern a()
och lägger sedan till en till varje element. Omtilldelningen påverkar dock inte den underliggande matrisvariabeln i den anropande koden.
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)))
Det första MsgBox
anropet visar "After increase(n): 11, 21, 31, 41". Eftersom matrisen n
är en referenstyp increase
kan ändra dess medlemmar, även om överföringsmekanismen är ByVal
.
Det andra MsgBox
anropet visar "After replace(n): 11, 21, 31, 41". Eftersom n
skickas ByVal
replace
kan inte ändra variabeln n
i den anropande koden genom att tilldela en ny matris till den. När replace
skapar den nya matrisinstansen k
och tilldelar den till den lokala variabeln a
förlorar den referensen till n
som skickas av den anropande koden. När den ändrar medlemmarna a
i påverkas endast den lokala matrisen k
. replace
Därför ökar inte värdena för matrisen n
i den anropande koden.
Kompilera koden
Standardvärdet i Visual Basic är att skicka argument efter värde. Det är dock bra programmeringspraxis att inkludera nyckelordet ByVal eller ByRef med varje deklarerad parameter. Detta gör koden enklare att läsa.
Se även
- Förfaranden
- Procedureparametrar och argument
- Anvisningar: Skicka argument till en procedur
- Skicka argument efter värde och efter referens
- Skillnader mellan modifierbara och icke-modifierbara argument
- Skillnader mellan att skicka ett argument efter värde och efter referens
- Anvisningar: Ändra värdet för ett procedurargument
- Instruktioner: Tvinga ett argument att skickas av värde
- Skicka argument efter position och efter namn
- Värdetyper och referenstyper