Dela via


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 ByValreplace 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 aförlorar den referensen till n som skickas av den anropande koden. När den ändrar medlemmarna ai 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