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í argumentuByVal
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ý
ByVal
typ 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 jejByRef
.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
neboObject
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íšeByRef
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 Calculate
ByRef
má parametr ByVal
i parametr. Vzhledem k úrokové sazbě rate
a součtu peněz debt
je ú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