Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 tillkommer utöver de parenteser som innesluter argumentlistan i anropet.
Den anropande koden kan inte åsidosätta en ByVal-mekanism .
För att tvinga ett argument att skickas som 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. I anropet som tvingar ByVal
, observera de två nivåerna av parenteser.
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
- Procedurer
- Procedurparametrar och -argument
- Anvisningar: Skicka argument till en procedur
- Överföra argument genom värde och 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
- Passera argument via position och via namn
- Värdetyper och Referenstyper