문제

나에게 다소 불분명 한 것은 vb.net의 수업에 대한 참조 (포인터?)입니다. 내가 묻는 질문은 약간의 테스트로 답변 할 수 있지만, 누군가가 괜찮은 설명 (또는 링크)을 게시 할 수 있는지 궁금했습니다.

수업을 만드는 경우 :

Public Class ReferenceClass

    Private myBooleanValue As Boolean = False
    Public Property BooleanValue As Boolean
        Get
            Return myBooleanValue
        End Get
        Set(value As Boolean)
            myBooleanValue = value
        End Set
    End Property

End Class

그런 다음 실제로이 클래스를 속성으로 사용하는 수업은 다음과 같습니다.

Public Class UsingClass

     Private myReference As ReferenceClass
     Public Property Reference As ReferenceClass
        Get
             return myReference
         End Get
         Set(value As ReferenceClass)
             myReference = value
         End Set
     End Property

     Public Sub New(ByVal Reference As ReferenceClass)
         myReference = Reference
     End Sub

End Class

그런 다음 다음과 같이 사용하십시오.

Public Class RuntimeOrSomething

     Public Shared myReference As ReferenceClass
     Public Shared ReadOnly Property Reference As ReferenceClass
         Get
             If myReference Is Nothing Then myReference = new ReferenceClass()
             return myReference
         End Get
     End Property

     Public Shared Function BooleanCheck() As Boolean
         Reference.BooleanValue = True
         Dim tempClass As New UsingClass(Reference)
         tempClass.Reference.BooleanValue = False

         Return (tempClass.Reference.BooleanValue = Reference.BooleanValue)
     End Sub

     Public Shared Sub DoNothing()
          Reference.BooleanValue = True
          Dim someBoolean As Boolean = BooleanCheck

          ' Now Reference.Booleanvalue is "False"
     End Sub

End Class

이제 기능 BooleanCheck 항상 돌아올 것입니다 true, 참조가 새로운 클래스로 전달 되더라도 UsingClass 참조가 아니라 "가치에 의해". 그래서 수업 사본은 만들어지지 않았지만 로컬 변수 myReference 안에 UsingClass 여전히 부동산을 참조/지적합니다 Reference 안에 RuntimeOrSomething.

이것이 어떻게 우아하게 설명 될 수 있습니까?

도움이 되었습니까?

해결책

참조는 객체의 인스턴스를 가리키며 객체의 인스턴스가 아닙니다. 객체에 대한 지시 사항의 사본을 만들면 다른 객체를 만들지 않으며 동일한 객체를 가리키는 다른 참조를 만듭니다.

다른 팁

무릎에 유아와 함께 기차를 타이핑하는 데 많은 시간을 할애 할 수는 없습니다. 그러나 도움이 될 수있는 몇 가지 기사가 있습니다. 그들은 c#에 대해 작성되었지만 vb.net에도 동일하게 적용됩니다.

에서 MSDN:

ByVal 키워드를 사용하여 값으로 변수 인수를 전달하면 프로 시저가 변수 자체를 수정할 수 없습니다. 그러나 인수가 참조 유형 인 경우 객체 자체를 교체 할 수는 없지만 가리키는 객체의 멤버를 수정할 수 있습니다. 특히 객체의 멤버를 수정할 수 있습니다. 예를 들어, 인수가 배열 변수 인 경우 새 배열을 할당 할 수는 없지만 하나 이상의 요소를 변경할 수 있습니다. 변경된 요소는 호출 코드의 기본 배열 변수에 반영됩니다.

참조 클래스는 참조 유형이므로 ByVal을 전달하면 새 객체 (그렇지 않은)로 교체 할 수는 없지만 내부 (수행하는)와 함께 멍청 할 수 있습니다. Byref를 통과하든 Byval을 통과하든, 내부와 함께 주위를 돌면 원래 물체에 여전히 영향을 미칩니다 (메모리에는 하나의 객체 만 있기 때문에).

이 라인에서 :

Dim tempClass as New UsingClass(Reference)

객체가 Reference 속성은 "가치"에 의해 통과되지만 물체 그것은 복사됩니다. 그건 참조 복사 된 그 개체에 (예 : MyReference 및 TempClass.Reference는 동일한 개체에 대한 두 가지 "포인터"입니다. 그러면 할 수 있습니다. tempClass.Reference = new ReferenceClass 그리고 MyReference와 TempClass.reference는 여전히 두 개의 뚜렷한 "포인터"이지만 이제는 각각 서로 다른 객체를 가리 킵니다.

VB.NET에서 ByVal/Byref 클래스를 통과 할 때 C 프로그래밍 및 포인터 측면에서 생각할 수 있습니다.

ByVal = passing arguments via - a pointer 
ByRef = passing arguments via - a pointer to a pointer

예를 들어 끈을 가져 가십시오

' ByRef - modify str pointer to "point" to a new string
Sub Test_Ref(ByRef str as string)
    str = "New String ByRef"
End Sub

' ByVal - can't modify str pointer must return a (pointer to) new string
Function Test_Val(ByVal str as String) as String
    Return "New String ByVal"
End Sub

Sub Main()
    Dim strTest as String = "Hello World!"
    Console.WriteLine(strTest)
    Test_Ref(strTest)
    Console.WriteLine(strTest)
    Test_Val(strTest)
    Console.WriteLine(strTest) ' oops still pointing to same string
    strTest = Test_Val(strTest)
    Console.WriteLine(strTest) ' that's better :)
End Sub

위에서 말했듯이, 다른 객체 변수를 다른 객체 변수와 동일하게 설정하면 "포인터"를 메모리의 동일한 객체의 인스턴스로 설정합니다.

Public Function Clone() As Object Implements ICloneable.Clone
Return Me.MemberwiseClone()
End Function

객체가 클론 방법을 사용하여 할당 할 때

Dim tempClass as ReferenceClass = Reference.Clone
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top