Share via


방법: 인수가 값으로 전달되도록 설정(Visual Basic)

프로시저 선언은 전달 메커니즘을 결정합니다. 매개 변수가 ByRef로 선언된 경우 Visual Basic은 해당 인수를 참조로 전달해야 합니다. 이렇게 하면 프로시저는 호출 코드에서 인수의 기본 프로그래밍 요소의 값을 변경할 수 있습니다. 이러한 변경으로부터 기본 요소를 보호하려면 인수 이름을 괄호로 묶어 프로시저 호출의 ByRef 전달 메커니즘을 재정의할 수 있습니다. 이러한 괄호는 호출의 인수 목록을 묶는 괄호에 추가됩니다.

호출 코드는 ByVal 메커니즘을 재정의할 수 없습니다.

인수가 값으로 전달되도록 설정

  • 해당 매개 변수가 프로시저에서 ByVal로 선언된 경우에는 추가 단계를 수행할 필요가 없습니다. Visual Basic은 이미 값으로 인수를 전달할 것으로 예상합니다.

  • 프로시저에서 해당 매개 변수가 ByRef로 선언되면 프로시저 호출의 인수를 괄호로 묶습니다.

예시

다음 예제에서는 ByRef 매개 변수 선언을 재정의합니다. ByVal을 강제하는 호출에서 두 가지 수준의 괄호를 확인합니다.

Sub setNewString(ByRef inString As String)
    inString = "This is a new value for the inString argument."
    MsgBox(inString)
End Sub
Dim str As String = "Cannot be replaced if passed ByVal"

' The following call passes str ByVal even though it is declared ByRef.
Call setNewString((str))
' The parentheses around str protect it from change.
MsgBox(str)

' The following call allows str to be passed ByRef as declared.
Call setNewString(str)
' Variable str is not protected from change.
MsgBox(str)

str이 인수 목록 내에서 추가 괄호로 묶인 경우에는 setNewString 프로시저가 호출 코드에서 값을 변경할 수 없으며 MsgBox에 "ByVal을 전달하면 바꿀 수 없습니다"를 표시됩니다. str이 추가 괄호 안에 묶여 있지 않은 경우에는 프로시저가 값을 변경할 수 있으며 MsgBox에 "inString 인수의 새 값입니다."가 표시됩니다.

코드 컴파일

참조로 변수를 전달하는 경우 ByRef 키워드를 사용하여 이 메커니즘을 지정해야 합니다.

Visual Basic의 기본값은 인수를 값으로 전달하는 것입니다. 그러나 선언된 모든 매개 변수와 함께 ByVal 또는 ByRef 키워드를 포함하는 것이 좋습니다. 이렇게 하면 코드를 더 쉽게 읽을 수 있습니다.

강력한 프로그래밍

프로시저가 매개 변수 ByRef를 선언하는 경우 코드의 올바른 실행은 호출 코드의 기본 요소를 변경할 수 있는지에 따라 달라질 수 있습니다. 호출 코드가 인수를 괄호로 묶어 이 호출 메커니즘을 재정의하거나 수정할 수 없는 인수를 전달하는 경우 프로시저는 기본 요소를 변경할 수 없습니다. 이로 인해 호출 코드에서 예기치 않은 결과가 발생할 수 있습니다.

.NET Framework 보안

프로시저가 호출 코드의 인수를 기본으로 하는 값을 변경할 수 있는 잠재적인 위험이 항상 있습니다. 이 값이 변경될 것으로 예상하는지 확인하고 사용하기 전에 유효성을 검사하도록 준비해야 합니다.

참고 항목