为结构中的属性赋值

时间:2021-04-19 16:09:43

标签: vb.net

在下面的代码中,“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

请帮忙。

3 个答案:

答案 0 :(得分:0)

编译器应该指出“表达式是一个值,因此不能成为赋值的目标”。

SizeStructure 更改为 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)

此行为是值类型 (Structures) 的基础。从概念上讲,值类型的实例应该表示单个不可变值,并且任何具有相同值的实例都应该是等效的。正如您所观察到的,如果您尝试更改现有值类型的一部分,您会得到非常令人惊讶的行为。真的不是为了让您能够分段更改它们。

出于这个原因,我始终建议将值类型的成员标记为 ReadOnly,这样您就无法在构造后尝试更改它们。

如果您希望能够将某些东西视为可变对象实例而不是不可变值,则它需要是引用类型(Class)。这就是他们的目的。

答案 2 :(得分:0)

经过大量搜索,我发现了以下文章,它可能解释了我们无法通过 FORM 类的实例直接访问 SIZE 结构的高度/宽度属性的原因。要求人们通过这个,因为作者已经给出了很多细节:

http://www.albahari.com/valuevsreftypes.aspx

PL 可以随意分享任何意见分歧。