Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.
Megkülönböztetések
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
Gondosan válassza ki az átviteli módot minden argumentumhoz.
Védelem. A két paraméterátadási mechanizmus közötti választásnál a legfontosabb kritérium a hívási 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 tud felülírni egy 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: Hogyan kényszeríthető egy argumentum érték szerinti átadásra.
A Visual Basicben az alapértelmezés szerint az argumentumok érték szerint kerülnek átadásra.
Mikor adjunk át egy argumentumot é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 Calculate
eljárásnak van egy ByVal
és egy ByRef
paramétere. 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 a debt
egy ByRef
paraméter, az új összeg a hívó kódban a debt
-nek megfelelő argumentum értékében jelenik meg. A rate
nem módosíthatja az értékét, ezért a ByVal
egy Calculate
paraméter.
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
Lásd még
- 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