Private Sub A()
Dim Idx as integer = 0
B(Idx)
msgbox(Cstr(Idx))
End Sub
Private Sub B(Byvar idx as integer)
idx += 1
End Sub
위의 경우 함수 A의 Idx 변수는 B에의해 +1이 이뤄 졌지만,
메모리 참조는 하지 않기 때문에 결과는 0 이 출력된다.
하지만, 재귀함수 같은 경우 Idx를 B함수에서 공유해서 (연결해서) 사용해야 하는 경우가 있다.
이때의 개념이 Call by reference이다. (위의 예제는 Call by value)
Private Sub A()
Dim Idx as integer = 0
B(Idx)
msgbox(Cstr(Idx))
End Sub
Private Sub B(Byref idx as integer)
idx += 1
End Sub
위의 결과는 '1'.
관련 자료
https://msdn.microsoft.com/ko-kr/library/41zywfyc(v=vs.90).aspx
Visual Basic 2008에서는 인수가 프로시저에 전달되는 방법에 영향을 주는 몇 가지 사항이 변경되었습니다.
Visual Basic 6.0
Visual Basic 6.0에서는 프로시저 매개 변수에 대해 ByVal이나 ByRef를 지정하지 않으면 ByRef가 기본 전달 메커니즘으로 지정됩니다. 이렇게 되면 프로시저에 전달된 변수가 호출 프로그램에서 수정될 수 있습니다.
변수가 수정되면 문제가 발생할 수 있습니다. 다음 예제에서는 기본 전달 메커니즘이 ByRef이고, elapsedSeconds의 값이 minutesPastHour에 의해 변경되고, elapsedSeconds가 MsgBox에 잘못 표시됩니다.
Function minutesPastHour(seconds As Integer) As Integer Dim hours As Integer = seconds \ 3600 seconds = seconds Mod 3600 Return seconds \ 60 End Function Sub showSecondsAndMinutes() Dim elapsedSeconds, extraMinutes As Integer elapsedSeconds = CInt(Timer()) ' Integer seconds since midnight. extraMinutes = minutesPastHour(elapsedSeconds) MsgBox "Total seconds: " & elapsedSeconds & _ "; minutes past hour: " & extraMinutes End Sub
ByRef 인수를 전달하면 호출 프로그램이 해당 인수를 변경할 수 있으므로 예상치 못한 동작이 발생할 수 있습니다. 또한 해당 프로시저가 다른 프로시저를 호출한 다음 ByRef 인수를 전달하면 원래 변수가 변경될 가능성이 높아집니다.
Visual Basic 2008
Visual Basic 2008에서는 프로시저를 선언할 때 모든 매개 변수의 기본 전달 메커니즘이 ByVal입니다. 이렇게 되면 인수가 수정되지 않습니다. 이전 예제의 선언은 다음과 같이 다시 쓸 수 있습니다.
Function MinutesPastHour(ByVal Seconds As Integer) As Integer
seconds를 값으로 전달하면 프로시저가 호출 프로그램에서 해당 변수에 액세스할 수 없으므로 앞에서 설명한 문제를 방지할 수 있습니다.
ByVal이 기본 메커니즘이지만 모든 매개 변수에 대해 ByVal을 명시적으로 지정하면 코드가 명확해지고 가독성이 향상됩니다.
Visual Basic 6.0
Visual Basic 6.0에서 ByRef 인수로 프로시저에 전달된 속성은 프로시저 내부로는 복사되지만 외부로는 복사되지 않습니다. 따라서 ByRef 인수가 전달된 경우에도 이러한 속성 인수에 대한 수정 사항이 호출 프로그램의 원래 속성에 다시 반영되지 않습니다.
Visual Basic 2008
Visual Basic 2008에서 ByRef로 전달된 속성 인수는 프로시저 내부 및 외부로 모두 복사됩니다. 다음 예제에서는 프로시저로 속성을 변경할 수 있는 방법을 보여 줍니다.
Sub Reduce(ByRef Height As Single) ' ... ... ... ... ... ... ... ' Code to modify Height argument. End Sub
Dim Sq As Square = New Square ' Square has property Side of type Single. Reduce(Sq.Side) ' Side is changed when Reduce returns.
프로시저에서 속성 인수를 수정하면 원래 속성의 값이 호출 프로그램에서 즉시 변경되지 않습니다. 대신 프로시저가 복귀될 때 해당 내용이 복사됩니다.
'VB.net & WPF & C#' 카테고리의 다른 글
[VB.net / C#] Class와 Module의 차이 (0) | 2017.04.10 |
---|---|
C# System.Threading.Timer Raw (0) | 2017.03.21 |
Mathematical Expressions Evaluator for .NET(formula parser) (0) | 2017.03.14 |
Nicely format an XML document in VB.NET (0) | 2017.01.19 |
VB.net XmlNode Name 바꾸기. (0) | 2017.01.04 |