在下面的代码中,“f”是类 FORM 的一个实例,它有一个 SIZE 类型的属性“s”,一个在代码中定义的结构。我的问题是:当我尝试直接为实例“t”的属性“s”的属性赋值时,它不起作用:那就是语句 f.s.height = 15
不起作用。我的困惑源于这样一个事实,即当我打印实例“f”的属性“s”的值时,我能够打印结构 SIZE 的各个属性,但在赋值时不能这样做。赋值需要我调用构造函数。为什么会这样?什么阻止了将值分配给“s”的属性:即 f.s.height & f.s.width?
Module Module1
Sub Main()
Dim f As New MyForm()
f.s = New Size(2, 5) 'Works Fine
f.colour = "Red" 'Assignment works just fine
'Below: Individual elements cannot be acceessed for assignment. WHY?
f.s.height = 15 'Doesn't Work
f.s.height = +2 'Doesn't work
'Individual elements can be accessed while printing
Console.WriteLine("Widht = {0}", f.s.width)
Console.WriteLine("Height = {0}", f.s.height)
Console.ReadLine()
End Sub
End Module
Class MyForm
Public Property s As Size
Public Property colour As String
End Class
Public Structure Size
Dim height As Integer
Dim width As Integer
Public Sub New(ByVal w As Integer, ByVal h As Integer)
width = w
height = h
End Sub
End Structure
请帮忙。
答案 0 :(得分:0)
编译器应该指出“表达式是一个值,因此不能成为赋值的目标”。
将 Size
从 Structure
更改为 Class
(并将 Dim
更改为 Property
)以解决问题:
Public Class Size
Property height As Integer
Property width As Integer
Public Sub New(w As Integer, h As Integer)
width = w
height = h
End Sub
End Class
顺便说一下,您还会看到标准 System.Drawing.Size
的这种行为,它被定义为 Structure
而不是 Class
。 (Point
和其他人可能也是如此。)
答案 1 :(得分:0)
此行为是值类型 (Structure
s) 的基础。从概念上讲,值类型的实例应该表示单个不可变值,并且任何具有相同值的实例都应该是等效的。正如您所观察到的,如果您尝试更改现有值类型的一部分,您会得到非常令人惊讶的行为。真的不是为了让您能够分段更改它们。
出于这个原因,我始终建议将值类型的成员标记为 ReadOnly
,这样您就无法在构造后尝试更改它们。
如果您希望能够将某些东西视为可变对象实例而不是不可变值,则它需要是引用类型(Class
)。这就是他们的目的。
答案 2 :(得分:0)
经过大量搜索,我发现了以下文章,它可能解释了我们无法通过 FORM 类的实例直接访问 SIZE 结构的高度/宽度属性的原因。要求人们通过这个,因为作者已经给出了很多细节:
http://www.albahari.com/valuevsreftypes.aspx
PL 可以随意分享任何意见分歧。