Przekazywanie argumentów według wartości i według odwołania (Visual Basic)
W Visual Basic, argument można przekazać do procedury przez wartość lub przez odwołanie.Jest to znane jako przekazując mechanizm, i określa, czy procedury można zmodyfikować element programowania, leżących u podstaw argumentu w kodu wywołującego.W deklaracji procedury określa mechanizm przekazywania dla każdego parametru, określając ByVal (Visual Basic) lub ByRef (Visual Basic) słowa kluczowego.
Wyróżnienia
Podczas przekazywania argumentu procedury, należy pamiętać o kilku różnych wyróżnień, które współdziałają ze sobą:
Czy jest podstawowym elementem programowania, modyfikować lub nonmodifiable
Czy jest sam argument, modyfikować lub nonmodifiable
Czy argument jest przekazywany przez wartość lub przez odwołanie
Czy typ danych argumentem jest wartość typu lub typ odwołania
Aby uzyskać więcej informacji, zobacz Różnice pomiędzy argumentami modyfikowalnymi i niemodyfikowalnymi (Visual Basic) i Różnice pomiędzy przekazywaniem argumentu według wartości i według odwołania (Visual Basic).
Wybór mechanizmu przekazywania
Wybierz mechanizm przekazywania starannie dla każdego argumentu.
Ochrona.Wybierając między mechanizmami dwóch przejeżdżających, najważniejszym kryterium jest ekspozycji zmiennych, aby zmienić wywołania.Zaletą przekazanie argumentu ByRef jest, że procedura może zwrócić wartość do kodu wywołującego przez ten argument.Zaletą przekazanie argumentu ByVal jest to chroni zmiennej przed zmianami wprowadzanymi przez procedurę.
Wydajność.Chociaż mechanizm przekazywania może mieć wpływ na wydajność kodu, różnica jest zwykle nieznaczna.Jedynym wyjątkiem jest przekazywana wartość typu ByVal.W tym przypadku Visual Basic kopiuje zawartość całego danych argumentu.W związku z tym, jak struktury typu dużą wartość, może być bardziej efektywne, aby przekazać je ByRef.
Dla typu odwołania tylko wskaźnik do danych jest skopiowany (cztery bajty na platformach 32-bitowych i 8 bajtów na platformach 64-bitowych).W związku z tym, można przekazywać argumenty typu String lub Object przez wartość bez szkody dla wydajności.
Oznaczanie mechanizm przekazywania
W deklaracji procedury określa mechanizm przekazywania dla każdego parametru.Nie można zastąpić kod wywołujący ByVal mechanizmu.
Jeśli parametr jest zadeklarowana z ByRef, kod wywołujący może wymusić mechanizm do ByVal , ograniczając nazwę argumentu w nawiasach w wywołaniu.Aby uzyskać więcej informacji, zobacz Porady: wymuszanie przekazywania argumentu przez wartość (Visual Basic).
Domyślnie w Visual Basic jest przekazywanie argumentów przez wartość.
Gdy Argument jest przekazywany za pomocą wartości
Jeśli wywołujący element kod leżących u podstaw argument jest nonmodifiable element, należy zadeklarować odpowiedni parametr ByVal (Visual Basic).Kod nie można zmienić wartości elementu nonmodifiable.
Jeśli można modyfikować jest podstawowym elementem, ale nie chcesz, aby procedury, aby móc zmienić jej wartość, należy zadeklarować parametr ByVal.Tylko kod wywołujący można zmienić wartość elementu można modyfikować, przekazywane przez wartość.
Kiedy przekazanie przez odniesienie do
Jeśli procedura nie ma prawdziwy potrzebę zmiany podstawowych elementów w kod wywołujący, zadeklarować odpowiedni parametr ByRef (Visual Basic).
Jeśli poprawnego wykonywania kodu, zależy od zmiany podstawowych elementów w kod wywołujący procedurę, należy zadeklarować parametr ByRef.Jeśli przechodzą przez wartość lub zastępuje kod wywołujący ByRef przekazując mechanizm umieszczając argument w nawiasach, wywołanie procedury może dawać nieoczekiwane wyniki.
Przykład
Opis
Poniższy przykład ilustruje, kiedy argument jest przekazywany przez wartość i kiedy do przekazania ich przez odwołanie.Procedura Calculate zarówno ma ByVal i ByRef parametru.Biorąc pod uwagę stopy oprocentowania, ratei sumę pieniędzy, debt, procedura jest obliczyć nową wartość dla debt to jest wynikiem zastosowania stopy procentowej do wartości oryginalnej debt.Bo debt jest ByRef parametr, nowa suma jest odzwierciedlony w wartości argumentu w kod wywołujący, który odpowiada debt.Parametr rate jest ByVal parametr bo Calculate nie należy zmieniać jego wartość.
Code
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
Zobacz też
Zadania
Porady: przekazywanie argumentów do procedury (Visual Basic)
Porady: zmienianie wartości argumentu procedury (Visual Basic)
Porady: chronienie argumentu procedury przed zmianami wartości (Visual Basic)
Porady: wymuszanie przekazywania argumentu przez wartość (Visual Basic)
Koncepcje
Parametry i argumenty procedur (Visual Basic)
Przekazywanie argumentów według pozycji i według nazwy (Visual Basic)