vb.net의 참조
-
23-08-2019 - |
문제
나에게 다소 불분명 한 것은 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