Argumentumok átadása érték és hivatkozás szerint (Visual Basic)
A Visual Basicben érték vagy hivatkozás alapján adhat át argumentumokat egy eljárásnak. Ezt átengedő mechanizmusnak nevezzük, és meghatározza, hogy az eljárás módosíthatja-e a hívó kód argumentumának alapjául szolgáló programozási elemet. Az eljárásdeklaráció az egyes paraméterek továbbítási mechanizmusát a ByVal vagy a ByRef kulcsszó megadásával határozza meg.
Különbséget
Amikor argumentumot ad át egy eljárásnak, vegye figyelembe az egymással interakcióban álló különböző különbségeket:
Az alapul szolgáló programozási elem módosítható vagy nem módosítható
Az argumentum módosítható vagy nem módosítható
Azt jelzi, hogy az argumentumot érték vagy hivatkozás alapján adja-e át.
Az argumentum adattípusa értéktípus vagy hivatkozástípus
További információkért tekintse meg a módosítható és a nem módosítható argumentumok közötti különbségeket, valamint az argumentumok érték és hivatkozás szerinti átadása közötti különbségeket.
Az átadási mechanizmus kiválasztása
Minden argumentumhoz gondosan válassza ki az átengedési mechanizmust.
Védelem. A két átengedési mechanizmus közötti választásnál a legfontosabb kritérium a változók változók változásnak való kitettsége. Az argumentumok
ByRef
átadásának előnye, hogy az eljárás ezen az argumentumon keresztül visszaadhat egy értéket a hívó kódnak. Az argumentumokByVal
átadásának előnye, hogy megvédi a változókat attól, hogy az eljárás módosítsa őket.Teljesítmény. Bár az átadási mechanizmus befolyásolhatja a kód teljesítményét, a különbség általában jelentéktelen. Ez alól kivételt képez egy átadott
ByVal
értéktípus. Ebben az esetben a Visual Basic az argumentum teljes adattartalmát másolja át. Ezért egy nagy értéktípus, például egy struktúra esetében hatékonyabb lehet átadniByRef
.Referenciatípusok esetén csak az adatokra mutató mutató lesz másolva (32 bites platformokon négy bájt, 64 bites platformokon nyolc bájt). Ezért a teljesítmény sérelme nélkül adhat át típus
String
- vagyObject
értékargumentumokat.
Az átadási mechanizmus meghatározása
Az eljárásdeklaráció az egyes paraméterek átadási mechanizmusát határozza meg. A hívókód nem tudja felülbírálni a mechanizmust ByVal
.
Ha egy paraméter deklarálva ByRef
van, a hívó kód kényszerítheti a mechanizmust úgy, hogy ByVal
zárójelbe foglalja az argumentum nevét a hívásban. További információkért lásd : Argumentum kényszerítése érték szerint.
A Visual Basicben az alapértelmezett érték az argumentumok átadása.
Argumentum átadása érték szerint
Ha az argumentum alapjául szolgáló hívókódelem nem módosítható elem, deklarálja a megfelelő ByVal paramétert. Egyetlen kód sem módosíthatja a nem módosítható elemek értékét.
Ha a mögöttes elem módosítható, de nem szeretné, hogy az eljárás módosítsa az értékét, deklarálja a paramétert
ByVal
. Csak a hívókód módosíthatja az érték által átadott módosítható elem értékét.
Mikor adjon át argumentumot hivatkozás alapján?
Ha az eljárásnak valóban módosítania kell a hívó kód mögöttes elemét, deklarálja a megfelelő ByRef paramétert.
Ha a kód helyes végrehajtása a hívó kód mögöttes elemét módosító eljárástól függ, deklarálja a paramétert
ByRef
. Ha értéket ad át, vagy ha a hívó kód felülbírálja azByRef
átengedési mechanizmust az argumentum zárójelekbe foglalásával, az eljáráshívás váratlan eredményeket eredményezhet.
Példa
Leírás
Az alábbi példa bemutatja, hogy mikor kell argumentumokat átadni érték szerint, és mikor kell hivatkozással átadni őket. Az eljárás Calculate
egy ByVal
és egy paraméterrel is rendelkezik ByRef
. A kamatláb rate
és a pénzösszeg debt
alapján az eljárás feladata egy új érték debt
kiszámítása , amely annak az eredménye , hogy a kamatlábat az eredeti értékre debt
alkalmazza . Mivel debt
paraméterről van szó ByRef
, az új összeg a hívó kódban szereplő argumentum értékében jelenik meg debt
. A paraméter rate
paraméter, ByVal
mert Calculate
nem módosíthatja az értékét.
Kód
Module Module1
Sub Main()
' Two interest rates are declared, one a constant and one a
' variable.
Const highRate As Double = 12.5
Dim lowRate = highRate * 0.6
Dim initialDebt = 4999.99
' Make a copy of the original value of the debt.
Dim debtWithInterest = initialDebt
' Calculate the total debt with the high interest rate applied.
' Argument highRate is a constant, which is appropriate for a
' ByVal parameter. Argument debtWithInterest must be a variable
' because the procedure will change its value to the calculated
' total with interest applied.
Calculate(highRate, debtWithInterest)
' Format the result to represent currency, and display it.
Dim debtString = Format(debtWithInterest, "C")
Console.WriteLine("What I owe with high interest: " & debtString)
' Repeat the process with lowRate. Argument lowRate is not a
' constant, but the ByVal parameter protects it from accidental
' or intentional change by the procedure.
' Set debtWithInterest back to the original value.
debtWithInterest = initialDebt
Calculate(lowRate, debtWithInterest)
debtString = Format(debtWithInterest, "C")
Console.WriteLine("What I owe with low interest: " & debtString)
End Sub
' Parameter rate is a ByVal parameter because the procedure should
' not change the value of the corresponding argument in the
' calling code.
' The calculated value of the debt parameter, however, should be
' reflected in the value of the corresponding argument in the
' calling code. Therefore, it must be declared ByRef.
Sub Calculate(ByVal rate As Double, ByRef debt As Double)
debt = debt + (debt * rate / 100)
End Sub
End Module
Kapcsolódó információk
- Eljárások
- Eljárásparaméterek és argumentumok
- Útmutató: Argumentumok átadása eljárásnak
- Útmutató: Eljárásargumentum értékének módosítása
- Útmutató: Eljárásargumentum védelme az értékváltozásokkal szemben
- Útmutató: Argumentum érték szerinti átadásának kényszerítése
- Argumentumok átadása pozíció és név szerint
- Értéktípusok és referenciatípusok
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: