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
- 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
- Så här: Skydda ett procedurargument mot värdeändringar
- Skicka argument efter position och efter namn
- Värdetyper och referenstyper