Dela via


Anvisningar: Tvinga ett argument att skickas av värde (Visual Basic)

Procedurdeklarationen bestämmer överföringsmekanismen. Om en parameter deklareras som ByRef förväntar sig Visual Basic att motsvarande argument skickas med referens. Detta gör att proceduren kan ändra värdet för det programmeringselement som ligger till grund för argumentet i den anropande koden. Om du vill skydda det underliggande elementet mot en sådan ändring kan du åsidosätta ByRef överföringsmekanismen i proceduranropet genom att omsluta argumentnamnet inom parenteser. Dessa parenteser är utöver parenteserna som omger argumentlistan i anropet.

Den anropande koden kan inte åsidosätta en ByVal-mekanism .

Så här tvingar du ett argument att skickas av ett värde

  • Om motsvarande parameter deklareras ByVal i proceduren behöver du inte vidta några ytterligare åtgärder. Visual Basic förväntar sig redan att skicka argumentet efter värde.

  • Om motsvarande parameter deklareras ByRef i proceduren omger du argumentet inom parenteser i proceduranropet.

Exempel

I följande exempel åsidosätts en ByRef parameterdeklaration. Observera de två nivåerna av parenteser i anropet som tvingar ByVal.

Sub setNewString(ByRef inString As String)
    inString = "This is a new value for the inString argument."
    MsgBox(inString)
End Sub
Dim str As String = "Cannot be replaced if passed ByVal"

' The following call passes str ByVal even though it is declared ByRef.
Call setNewString((str))
' The parentheses around str protect it from change.
MsgBox(str)

' The following call allows str to be passed ByRef as declared.
Call setNewString(str)
' Variable str is not protected from change.
MsgBox(str)

När str omges av extra parenteser i argumentlistan kan proceduren setNewString inte ändra dess värde i den anropande koden och MsgBox visar "Det går inte att ersätta om det skickas ByVal". När str inte omges av extra parenteser kan proceduren ändra den och MsgBox visar "Det här är ett nytt värde för argumentet inString".

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.

Robust programmering

Om en procedur deklarerar en parameter ByRef kan rätt körning av koden bero på att du kan ändra det underliggande elementet i den anropande koden. Om den anropande koden åsidosätter den här anropsmekanismen genom att omsluta argumentet inom parenteser, eller om det skickar ett icke-modifierat argument, kan proceduren inte ändra det underliggande elementet. Detta kan ge oväntade resultat i anropskoden.

.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