You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET类接口定义疑问:设置输入属性后如何自动更新输出属性?

问题解析与解决方案

核心问题原因

你在构造函数Sub New()中调用AddTwoNumbers()时,类的输入属性还未被赋值(此时m_inpHeight和m_inpHeight2都是默认的0),所以计算出的输出属性值是0。之后你设置输入属性时,没有触发重新计算,因此输出属性始终保持初始的0值,无法得到正确结果。

另外你的代码里存在一个逻辑错误:输入属性的Set方法中,判断条件用的是旧的私有变量值(比如If m_inpHeight > 20),而不是新传入的value,这会导致不符合限制条件的新值被错误赋值。

无需手动调用Sub的两种解决方案

方案一:输入属性变更时自动触发计算

修改输入属性的Set方法,每次设置合法的输入值后,立即调用计算Sub更新输出属性。同时修复判断条件的错误:

Public Class Class1
    Private m_inpHeight, m_inpHeight2 As Integer
    Private m_outHeight, m_outHeight2 As Integer

    Public Property Prp_inpHeight() As Integer
        Get
            Return m_inpHeight
        End Get
        Set(value As Integer)
            ' 修复:判断新传入的value,而非旧值
            If value > 20 Then Exit Property
            m_inpHeight = value
            ' 设置后触发计算
            AddTwoNumbers()
        End Set
    End Property

    Public Property Prp_inpHeight2() As Integer
        Get
            Return m_inpHeight2
        End Get
        Set(value As Integer)
            If value > 20 Then Exit Property
            m_inpHeight2 = value
            AddTwoNumbers()
        End Set
    End Property

    Public Property Prp_OutHeight() As Integer
        Get
            Return m_outHeight
        End Get
        Set(value As Integer)
            ' 输出属性无需外部设置,可留空或改为ReadOnly
        End Set
    End Property

    Public Property Prp_OutHeight2() As Integer
        Get
            Return m_outHeight2
        End Get
        Set(value As Integer)
        End Set
    End Property

    ' 构造函数可移除计算调用,因为输入设置时会自动触发
    Public Sub New()
    End Sub

    Private Sub AddTwoNumbers()
        m_outHeight = m_inpHeight + m_inpHeight2
        m_outHeight2 = m_inpHeight * 2
    End Sub
End Class

这样只要你设置输入属性,输出属性就会自动更新,无需手动调用AddTwoNumbers()。

方案二:将输出属性改为实时计算的只读属性

如果你的输出属性是输入属性的直接计算结果,完全可以去掉私有存储变量和计算Sub,在输出属性的Get方法中实时计算。这种方式代码更简洁,且始终保证输出是最新输入对应的结果:

Public Class Class1
    Private m_inpHeight, m_inpHeight2 As Integer

    Public Property Prp_inpHeight() As Integer
        Get
            Return m_inpHeight
        End Get
        Set(value As Integer)
            If value > 20 Then Exit Property
            m_inpHeight = value
        End Set
    End Property

    Public Property Prp_inpHeight2() As Integer
        Get
            Return m_inpHeight2
        End Get
        Set(value As Integer)
            If value > 20 Then Exit Property
            m_inpHeight2 = value
        End Set
    End Property

    ' 改为只读属性,实时计算输出
    Public ReadOnly Property Prp_OutHeight() As Integer
        Get
            Return m_inpHeight + m_inpHeight2
        End Get
    End Property

    Public ReadOnly Property Prp_OutHeight2() As Integer
        Get
            Return m_inpHeight * 2
        End Get
    End Property

    Public Sub New()
    End Sub
End Class

此时你获取输出属性时,会直接用当前的输入值计算,完全不需要手动触发任何Sub,也避免了存储冗余的输出变量。

方案选择建议

  • 如果你的计算逻辑复杂、计算耗时较长,或者需要多次复用计算结果,优先选择方案一(提前计算并存储结果)。
  • 如果计算逻辑简单、实时计算性能无压力,方案二更简洁易维护,尤其适合你这种8个左右输入输出属性的场景,能大幅减少代码量。

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:10:26