我尝试了以下内容:
我创建了一个类:
Public Class Class1
Private _MyRect As Rectangle
Public Property MyRect() As Rectangle
Get
Return _MyRect
End Get
Set(value As Rectangle)
_MyRect = value
End Set
End Property
End Class
然后我以一种形式实例化类及其矩形:
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim c As New Class1
Dim r As Rectangle = Rectangle.FromLTRB(10, 10, 50, 50)
c.MyRect = r
c.MyRect.Offset(100, 100)
Debug.Print(c.MyRect.ToString)
End Sub
End Class
调试字符串告诉我,抵消没有效果。
这里发生了什么,我将如何正确地做到这一点?
答案 0 :(得分:0)
问题是Rectangle
是一个值类型,所以这一行:
c.MyRect.Offset(100, 100)
实际上是对Class1
对象中包含的值的副本进行操作。如果您在分配到Offset
之前在r
上致电c.MyRect
,那么它就能正常运行。如果您希望能够在初始分配后进行更改,则需要获取属性值,将其分配给变量,调用Offset
,然后分配回属性:
Dim r1 = c.MyRect
r1.Offset(100, 100)
c.MyRect = r1
Debug.Print(c.MyRect.ToString)
请注意,如果Rectangle
是一个类而不是一个结构,那么您现有的代码将按预期工作。这是吸引很多人的价值类型和参考类型之间的重要区别。