创建新类实例时Shared变量无法正常共享问题求助
核心问题分析
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
相关产品推荐
相关产品推荐

