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
相关产品推荐
相关产品推荐

