VB.NET 中的参考资料
我有点不清楚的是 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
的。 因此,不会创建类的副本,但 UsingClass
中的局部变量 myReference
仍然引用/指向 中的属性
。Reference
RuntimeOrSomething
这该如何优雅地解释呢?
Somewhat unclear to me are references (pointers?) to classes in VB.NET. The question I am about to ask can be answered by a little bit of testing, but I was wondering if anybody could post a decent explanation (or links, too).
If you create a class:
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
And then a class which actually uses this class as a property:
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
And then use it like this:
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
Now the function BooleanCheck
will always return true
, even though the reference is passed to the new class UsingClass
"by value", not by reference. So a copy of the class is not made, but the local variable myReference
in UsingClass
still references/points to the property Reference
in RuntimeOrSomething
.
How can this be explained elegantly?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

发布评论
评论(6)
我现在不能花太多时间来回答这个问题——在火车上打字,膝盖上坐着一个小孩——但我有几篇文章可能会有所帮助。 它们是关于 C# 编写的,但同样适用于 VB.NET:
来自 MSDN:
如果您通过以下方式传递变量参数
使用 ByVal 关键字的值,
过程无法修改变量
本身。 但是,如果参数是
引用类型,可以修改
它所指向的对象的成员
点,即使你无法替代
对象本身。特别是,您
可以修改对象的成员。
例如,如果参数是
数组变量,您不能分配
新数组,但您可以更改
它的一个或多个元素。 这
更改的元素反映在
底层数组变量
调用代码。
由于您的 ReferenceClass 是引用类型,因此如果您通过 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
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
引用指向对象的实例,但它不是对象的实例。 复制该对象的方向不会创建另一个对象,而是创建另一个也指向同一对象的引用。
A reference points to an instance of an object, it is not an instance of an object. Making a copy of the directions to the object does not create another object, it creates another reference that also points to the same object.