Předávání argumentů podle hodnoty a odkazu (Visual Basic)

V jazyce Visual Basic můžete předat argument proceduře podle hodnoty nebo odkazu. To se označuje jako předávací mechanismus a určuje, zda procedura může upravit programovací prvek, který je základem argumentu ve volajícím kódu. Deklarace procedury určuje předávací mechanismus pro každý parametr zadáním klíčového slova ByVal nebo ByRef .

Rozdíly

Při předávání argumentu pro proceduru mějte na paměti několik různých rozdílů, které vzájemně spolupracují:

  • Zda je základní programovací prvek modifikovatelný nebo neupravitelný

  • Zda je samotný argument upravitelný nebo neupravitelný

  • Určuje, zda je argument předán hodnotou nebo odkazem.

  • Určuje, zda je datový typ argumentu typ hodnoty nebo odkazový typ.

Další informace naleznete v tématu Rozdíly mezi upravitelnými a nemodifikovatelnými argumenty a rozdíly mezi předáním argumentu podle hodnoty a odkazu.

Volba mechanismu předávání

Pro každý argument byste měli pečlivě zvolit mechanismus předávání.

  • Ochrana. Při výběru mezi těmito dvěma předávajícími mechanismy je nejdůležitějším kritériem vystavení volajících proměnných, které se mají změnit. Výhodou předání argumentu ByRef je, že procedura může vrátit hodnotu volajícímu kódu prostřednictvím tohoto argumentu. Výhodou předání argumentu ByVal je, že chrání proměnnou před tím, než ji procedura změní.

  • Výkon. Přestože předávací mechanismus může ovlivnit výkon kódu, rozdíl je obvykle nevýznamný. Jednou z výjimek je předaný ByValtyp hodnoty . V tomto případě Visual Basic zkopíruje celý obsah dat argumentu. Proto pro velký typ hodnoty, jako je struktura, může být efektivnější předat jej ByRef.

    U referenčních typů se zkopíruje pouze ukazatel na data (čtyři bajty na 32bitových platformách, osm bajtů na 64bitových platformách). Proto můžete předat argumenty typu String nebo Object podle hodnoty bez poškození výkonu.

Stanovení mechanismu předávání

Deklarace procedury určuje předávací mechanismus pro každý parametr. Volající kód nemůže přepsat ByVal mechanismus.

Pokud je parametr deklarován ByRef, volající kód může vynutit mechanismus ByVal uzavřením názvu argumentu do závorek ve volání. Další informace naleznete v tématu Postupy: Vynucení předání argumentu hodnotou.

Výchozí hodnota v jazyce Visual Basic je předání argumentů podle hodnoty.

Kdy předat argument podle hodnoty

  • Pokud volající prvek kódu podkladový argument je nemodifiable element, deklarujte odpovídající parametr ByVal. Žádný kód nemůže změnit hodnotu nemodifovatelného prvku.

  • Pokud je základní prvek upravitelný, ale nechcete, aby procedura mohla změnit jeho hodnotu, deklarujte parametr ByVal. Pouze volající kód může změnit hodnotu modifikovatelného prvku předaného hodnotou.

Kdy předat argument odkazem

  • Pokud má procedura skutečnou potřebu změnit základní prvek ve volajícím kódu, deklarujte odpovídající parametr ByRef.

  • Pokud správné spuštění kódu závisí na postupu, který mění základní prvek ve volajícím kódu, deklarujte parametr ByRef. Pokud ho předáte hodnotou nebo pokud volající kód přepíše ByRef mechanismus předávání uzavřením argumentu do závorek, volání procedury může vést k neočekávaným výsledkům.

Příklad

Popis

Následující příklad ukazuje, kdy předat argumenty podle hodnoty a kdy je předat odkazem. Procedura CalculateByRef má parametr ByVal i parametr. Vzhledem k úrokové sazbě ratea součtu peněz debtje úkolem postupu vypočítat novou hodnotu debt , která je výsledkem použití úrokové sazby na původní hodnotu debt. Protože debt je ByRef parametr, nový součet se odráží v hodnotě argumentu ve volajícím kódu, který odpovídá debt. Parametr rate je parametr, ByVal protože Calculate by neměl měnit jeho hodnotu.

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

Viz také