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

