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

创建新类实例时Shared变量无法正常共享问题求助

解决VB.NET中Shared Hashtable随实例创建方式异常重置的问题

核心问题分析

VB.NET的Shared成员是类级别的共享资源,理论上无论通过哪种方式创建类实例,所有实例都应该访问同一个Shared变量实例。你遇到的重置问题,本质不是实例声明方式导致的,而是ServerASync类内部对bSocket_Monitored的初始化或修改逻辑存在错误。

常见原因及解决步骤

1. 实例构造函数中错误初始化Shared变量

这是触发该问题最常见的原因:如果在ServerASync的实例构造函数(Sub New())中重新赋值bSocket_Monitored,每次创建实例都会覆盖这个Shared变量,直接导致之前的数据丢失。示例错误代码:

Sub New()
    ' 错误操作:每次实例化都会重置Shared变量
    bSocket_Monitored = New Hashtable()
End Sub

解决办法:
将Shared变量的初始化移到声明时直接赋值,或者使用Shared构造函数(只会在类第一次被访问时执行一次):

Public Class ServerASync
    ' 方式1:声明时直接初始化Shared变量
    Private Shared bSocket_Monitored As New Hashtable()

    ' 方式2:使用Shared构造函数(适合复杂初始化逻辑)
    Shared Sub New()
        bSocket_Monitored = New Hashtable()
    End Sub

    Sub New()
        ' 实例构造函数中不要对Shared变量做初始化赋值
    End Sub
End Class

2. 其他代码主动重置Shared变量

检查项目中所有修改bSocket_Monitored的代码,是否存在以下操作:

  • 调用bSocket_Monitored.Clear()清空所有元素
  • 重新赋值bSocket_Monitored = New Hashtable()
  • 清理逻辑(如Dispose方法)中修改该变量

解决办法:
仅保留初始化时的赋值操作,其他场景只对Hashtable的元素进行增删改(如bSocket_Monitored.Add(key, value)、bSocket_Monitored.Remove(key)),不要重置整个Hashtable对象。

3. 验证Shared行为的正确性

可以编写简单测试代码,确认所有实例共享同一个bSocket_Monitored:

' 测试逻辑
Dim p1 As New ServerASync()
' 假设通过公共方法或将变量设为Public来添加元素
p1.bSocket_Monitored.Add("testKey", "testValue")

Dim p4 As ServerASync = New ServerASync()
' 正常情况下应该输出True,说明两个实例共享同一变量
Console.WriteLine(p4.bSocket_Monitored.ContainsKey("testKey"))

总结

实例声明方式(New写在声明行还是后续赋值)不会影响Shared变量的共享行为,问题根源在类内部对Shared变量的处理逻辑。修正初始化位置并排查所有修改该变量的代码,即可解决数据丢失问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:33:18