2010-12-07 2 views
4

아래의 getFile 함수에서 사용 된 ByVal 및 ByRef 매개 변수를 사용하여 함수를 코딩하는 것은 나쁜 습관 (VB.NET 또는 모든 언어)으로 간주됩니까?나쁜 루틴을 동일한 루틴에서 ByRef 및 ByVal 매개 변수를 전달하는 연습?

Function getFile(ByVal channel As Integer, _ 
       ByRef Filename As String, _ 
       ByRef Filesize As String) As Integer 
... 
End Function 

... 
Dim status As Integer 
Dim filename As String 
Dim filesize As Integer 

For channel In 1 To 16 
    status = getFile(channel, filename, filesize) 
    ... 
Next channel 
+3

이 메커니즘이 유용 할 수있는 곳을 알 수 있지만 궁극적으로 메서드의 출력이 복잡해집니다. 정수 및 (때로는) 파일 이름/파일 크기를 반환합니다. 세 가지 유형의 정보를 가진 간단한 구조체를 반환해야합니다. – Assaf

답변

6

저는 보통 ByRef을 피하려고합니다. 종종보기 흉하고 혼란 스럽습니다. ByValByRef을 혼합한다고해서 모두가 단지 ByRef IMHO 인 것보다 더 읽기 쉽도록 영향을 미치지 않습니다.

예를 들어 파일 이름 만 필요하면 filesize 변수를 전달해야합니다.이 파일 크기가 좀 더 못된 것 같습니다. 그리고 코드를 읽을 때 매개 변수가 변경 될 수 있다는 것을 놓치기 쉽습니다.

Assaf도 자신의 의견에서 말했듯이 대신 일반적으로 메서드가 모든 반환 데이터를 포함 할 수있는 일종의 구조를 반환하도록하여 전체적인 문제를 해결하려고합니다. 그리고 실패하면 나는 상태를 반환하기보다는 예외를 던질 것입니다 (상태가 어떤 종류의 오류라고 가정).

+1

동의. 필요한만큼 적절한 byref와 byval을 사용하면 금이됩니다. 대부분의 매개 변수는 전달되는 한 가지 방법이므로 byval이어야합니다. 그러나 어떤 경우에는 전달 된 매개 변수를 수정할 수 있어야합니다. 슈퍼 공통점은 아니지만 바이브를 쓴 이유입니다. – DarinH

+2

함수를 값을 반환해야하는 경우 일반적으로 함수가 반환 값이 아닌 byref 매개 변수가되도록하는 것이 가장 좋습니다. – DarinH

+2

함수가 둘 이상의 값을 반환해야하는 경우 해당 용도에 맞게 클래스 또는 구조체를 만들어야합니다. – DarinH

관련 문제