Anvisningar: Ändra värdet för ett procedurargument (Visual Basic)
När du anropar en procedur motsvarar varje argument som du anger en av parametrarna som definierats i proceduren. I vissa fall kan procedurkoden ändra värdet som ligger till grund för ett argument i den anropande koden. I andra fall kan proceduren bara ändra sin lokala kopia av ett argument.
När du anropar proceduren gör Visual Basic en lokal kopia av varje argument som skickas av ByVal. För varje argument som skickas av ByRef ger Visual Basic procedurkoden en direkt referens till programmeringselementet som ligger till grund för argumentet i den anropande koden.
Om det underliggande elementet i den anropande koden är ett ändringsbart element och argumentet skickas ByRef
kan procedurkoden använda direktreferensen för att ändra elementets värde i den anropande koden.
Ändra det underliggande värdet
Så här ändrar du det underliggande värdet för ett procedurargument i anropskoden
I procedurdeklarationen anger du ByRef för parametern som motsvarar argumentet.
I den anropande koden skickar du ett ändringsbart programmeringselement som argument.
I den anropande koden ska du inte omsluta argumentet i parenteser i argumentlistan.
I procedurkoden använder du parameternamnet för att tilldela ett värde till det underliggande elementet i den anropande koden.
Se exemplet längre ned för en demonstration.
Ändra lokala kopior
Om det underliggande elementet i den anropande koden är ett icke-modifierat element, eller om argumentet skickas ByVal
, kan proceduren inte ändra dess värde i den anropande koden. Proceduren kan dock ändra sin lokala kopia av ett sådant argument.
Så här ändrar du kopian av ett procedurargument i procedurkoden
I procedurdeklarationen anger du ByVal för parametern som motsvarar argumentet.
-eller-
I den anropande koden omger du argumentet i parenteser i argumentlistan. Detta tvingar Visual Basic att skicka argumentet efter värde, även om motsvarande parameter anger
ByRef
.I procedurkoden använder du parameternamnet för att tilldela ett värde till den lokala kopian av argumentet. Det underliggande värdet i anropskoden ändras inte.
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.
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)))
Det första MsgBox
anropet visar "After increase(n): 11, 21, 31, 41". Eftersom matrisen n
är en referenstyp replace
kan ändra dess medlemmar, även om överföringsmekanismen är ByVal
.
Det andra MsgBox
anropet visar "After replace(n): 101, 201, 301". Eftersom n
skickas ByRef
kan du replace
ändra variabeln n
i den anropande koden och tilldela en ny matris till den. Eftersom n
är en referenstyp replace
, kan också ändra dess medlemmar.
Du kan förhindra att proceduren ändrar själva variabeln i den anropande koden. Se Så här: Skydda ett procedurargument mot värdeändringar.
Kompilera koden
När du skickar en variabel med referens måste du använda nyckelordet ByRef
för att ange den här mekanismen.
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.
.NET Framework-säkerhet
Det finns alltid en potentiell risk med att tillåta en procedur att ändra värdet som ligger till grund för ett argument i anropskoden. Se till att du förväntar dig att det här värdet ändras och var beredd på att kontrollera att det är giltigt innan du använder det.
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
- Så här: Skydda ett procedurargument mot värdeändringar
- Instruktioner: Tvinga ett argument att skickas av värde
- Skicka argument efter position och efter namn
- Värdetyper och referenstyper