Dela via


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 ByRefkan 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

  1. I procedurdeklarationen anger du ByRef för parametern som motsvarar argumentet.

  2. I den anropande koden skickar du ett ändringsbart programmeringselement som argument.

  3. I den anropande koden ska du inte omsluta argumentet i parenteser i argumentlistan.

  4. 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

  1. 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.

  2. 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 ByRefkan 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