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

VB如何实现带内部状态记忆的类 完成递推运算替代全局变量与ByRef传参

VB.NET 类内部状态保留与递推功能实现方案

问题原因

你的代码存在两个核心错误导致输出始终为0:

  • 构造函数逻辑缺失:构造函数参数_value和类实例字段_value同名,且构造函数内没有将参数值赋值给实例字段的逻辑,导致实例字段_value始终保持Integer类型的默认初始值0,无论乘2多少次结果都是0。
  • 函数无返回值:Value方法作为Function类型,没有指定返回值,VB.NET默认不会自动返回修改后的字段值。

修正代码

基础修正版(按你原有需求,首次调用返回初始值乘2的结果)

Class Example
    ' 内部状态字段设为私有,符合封装原则,避免外部随意修改
    Private _value As Integer
    Public Sub New(ByVal initialValue As Integer)
        ' 将传入的初始值赋值给实例内部字段
        _value = initialValue
    End Sub
    Public Function Value() As Integer
        _value *= 2
        ' 返回修改后的值
        Return _value
    End Function
End Class

' 调用代码保持不变即可
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim x As New Example(2)
    For i = 0 To 9
        MessageBox.Show(x.Value)
    Next
End Sub

运行后会依次输出:4、8、16、32... 直到超出Integer范围。

调整输出顺序版(首次调用返回初始值2)

如果需要输出序列为2、4、8、16...,只需要调整Value方法的执行顺序:

Public Function Value() As Integer
    ' 先保存当前值
    Dim currentValue = _value
    ' 再更新内部状态
    _value *= 2
    ' 返回更新前的当前值
    Return currentValue
End Function

如果你希望构造函数参数名保持为_value,也可以用Me关键字明确指定赋值给实例字段,避免同名冲突:

Public Sub New(ByVal _value As Integer)
    Me._value = _value
End Sub

自定义随机数生成器优化建议

如果你要实现和系统Random类用法一致的自定义随机数生成器,可以参考以下优化点:

  • 所有内部状态字段全部设为私有,禁止外部直接访问修改,保证生成序列的一致性
  • 仿照Random类扩展Next(Integer min, Integer max)、NextDouble()等方法,在内部更新状态字段的基础上,转换为对应范围的结果返回
  • 可新增无参数构造函数,用系统时间戳作为默认种子初始化内部状态,实现和系统Random一致的无参实例化效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:54:04