我已经为此苦苦挣扎了几个小时。 希望你们中的一些人 vb.net 大师可以帮助我恢复理智。
场景 :我有一个对象 (mqtt_client(,它公开了我需要捕获和处理的连接/断开连接事件。 我需要从代码中的多个子/函数/模块访问该对象。所以我在封闭类内但在代码块之外声明它是 Public。
如果我像这样在主子之外声明它:
Public mqtt_client = New MqttFactory().CreateManagedMqttClient
Public Sub Ruptela_Server(sender As Object, e As EventArgs) Handles MyBase.Load
' Add Event Handlers for Connected and disconnected events
AddHandler mqtt_client.Disconnected, AddressOf MQTTclient_disconnected_handler
AddHandler mqtt_client.Connected, AddressOf MQTTclient_connected_handler
添加处理程序失败,因为mqtt_client没有公开事件,我不确定为什么。
但是,如果我这样做:
Public Sub Ruptela_Server(sender As Object, e As EventArgs) Handles MyBase.Load
Dim mqtt_client = New MqttFactory().CreateManagedMqttClient
' Add Event Handlers for Connected and disconnected events
AddHandler mqtt_client.Disconnected, AddressOf MQTTclient_disconnected_handler
AddHandler mqtt_client.Connected, AddressOf MQTTclient_connected_handler
然后 addhandler 可以很好地连接,但是该对象仅在 sub 内部具有作用域,并且无法从其他模块访问。
我不能将所有这些代码放在封闭块之外,因为 addhandler 是一种方法,在那里不起作用。
我应该怎么做? 任何指导都将不胜感激。
类型推断仅适用于局部变量,因此虽然这为mqtt_client
提供了带有Option Infer On
的.CreateManagedMqttClient
类型:
Public Sub Ruptela_Server(sender As Object, e As EventArgs) Handles MyBase.Load
Dim mqtt_client = New MqttFactory().CreateManagedMqttClient
这给了它类型 Object
:
Public mqtt_client = New MqttFactory().CreateManagedMqttClient
Public Sub Ruptela_Server(sender As Object, e As EventArgs) Handles MyBase.Load
使用 As
为字段指定显式类型,并在项目级别启用Option Explicit
以避免将来出现问题。(Option Explicit
和 Option Strict
应始终为所有源打开。