2010-03-01 2 views
3

방법에 BYVAL로하는 ByRef을 나는 많은 경고로 인해 제기전환은 VB.NET

를 호출 전환을 호출 '매개 변수를 다시 일치하는 인수로 zzzz. "

내 생각에 참조 형식이 사용되는 참조 형식 포인터를 사용하는 특별한 방법이 없기 때문에 byref에서 function 매개 변수를 변경하는 것이 안전합니다.이 동작은 정확하게 사용됩니다. 원본보다는 포인터를 복사하여 실행하는 경우 동일합니다.

또 다른 고려 사항은 기본 클래스에서 상속하는 두 개의 클래스가 있다는 것입니다. 바이 패스 매개 변수가 기본 클래스에서 더 좁은 구체 클래스로의 암시 적 캐스팅을 유발하는 것과 동일한 상황이 발생합니다. 다시 나는 byval을 실행하는이 코드에서 어떤 문제도 볼 수 없다.

참조 형식을 다룰 때 함수에 매개 변수를 사용하는 것과 관련된 조언이 있습니까?

현재 내 프로젝트에서 byref 주위로 전달되는 다른 것들은 데이터베이스 연결 개체 즉 OracleConnection 및 SqlConnection입니다. byref 주위를 통과 할만한 이유가 있습니까? 다시 매칭 인수 '하는 ByRef'매개 변수 '값'의 값을 복사에 '정수'를 '객체로부터

예 1

암시 적 변환.

전화 번호 :

cmd = New SqlCommand() 

cmd.Parameters.Add(CreateParameter("Alpha", SqlDbType.Int,ParameterDirection.Input, -1, AlphaValue)) 

기능 :

Private Function CreateParameter(ByVal parameterName As String, ByVal dbType As SqlDbType, ByVal direction As ParameterDirection, ByVal size As Integer, ByRef value As Object) As SqlParameter 
    Dim retParam As SqlParameter 
    retParam = New SqlParameter(parameterName, dbType) 
    retParam.Direction = direction 
    retParam.Size = size 
    retParam.Value = value 
    Return retParam 
End Function 

예 2

암시 적 변환 'System.Data.IDataReader'에서 System.Data.SqlClient.SqlDataReader '행 'ByRef'매개 변수 'reader'의 값을 일치하는 인수로 다시 복사합니다.

국가 번호 :

Dim reader As new SqlDataReader 

ReleaseReader(reader) 

방법 :

Public Sub ReleaseReader(ByRef reader As IDataReader) 
     If reader IsNot Nothing Then 
      If Not reader.IsClosed Then 
       reader.Close() 
      End If 
      reader.Dispose() 
     End If 
    End Sub 
+0

당신이 같은 경고를 재현하는 코드 샘플을 제공 할 수 있을까요? 'ByRef' /'ByVal' 매개 변수를 변경하면 경고를 지울 수 있지만 최선의 해결책은 아닙니다. – STW

답변

5

VB.Net에서하는 방법을 정의 또는 C#은 그 문제를 들어, 당신이 값 (ByVal의)하지 않는 한에 의해 매개 변수를 전달한다 ByRef 의미 체계를 활용해야합니다. 메서드 내에서 매개 변수 값을 다시 설정하지 않으면이 값을 ByVal 호출로 확실히 바꿉니다.

참조를 다시 설정하지만 호출 사이트에서 활용하지 않으면 ByVal 매개 변수를 사용하고 ByRef를 호출하는 도우미 메서드를 작성합니다. 결과 코드가 변환 오류의 영향을받지 않기 때문에 경고가 제거됩니다.예를 들어

:

Public Sub ExampleMethod(ByRef p1 As Object) 
    p1 = "foo" 
End Sub 

Public Sub ExampleMethodWrapper(ByVal p1 as Object) 
    ExampleMethod(p1) 
End Sub 

Public Sub Test() 
    Dim v1 As String = "hello" 
    Dim v2 As String = "world" 
    ExampleMethod(v1) ' Warning generated 
    ExampleMethodWrapper(v2) ' No warning 
End Sub 
+0

멋진 솔루션처럼 보입니다. – PeanutPower