Megosztás a következőn keresztül:


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 argumentumok ByVal á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 átadni ByRef.

    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 - vagy Object é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 ByRefvan, 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 az ByRef á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 debtalapjá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 debtalkalmazza . 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