【问题标题】:Event handler scope issue事件处理程序范围问题
【发布时间】:2018-08-18 11:00:48
【问题描述】:

我已经为此苦苦挣扎了好几个小时。希望你们中的一些 vb.net 大师可以帮助我恢复理智。

场景:我有一个对象 (mqtt_client),它公开了我需要捕获和处理的连接/断开连接事件。我需要可以从我的代码中的多个子/函数/模块访问该对象。所以我在封闭类中但在代码块之外声明它是公共的。

如果我像这样在主子之外声明它:

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

addhandler 失败,因为 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

然后 addhandlers 连接好,但是对象只在 sub 内部有范围,不能从不同的模块访问。

我不能将所有这些代码放在封闭块之外,因为 addhandler 是一种方法,不会在那里工作。

我应该怎么做?任何指导将不胜感激。

【问题讨论】:

    标签: vb.net events scope addhandler


    【解决方案1】:

    类型推断仅适用于局部变量,因此虽然这为 mqtt_client 提供了 .CreateManagedMqttClientOption Infer On 的类型:

    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
    

    使用Asenable Option Explicit at the project level 为字段指定显式类型以避免将来出现问题。 (Option ExplicitOption Strict 应始终为所有源打开。)

    【讨论】:

      【解决方案2】:

      @Ryan 谢谢。我之前曾尝试键入 mqtt_client AS ManagedClient ,但它失败了,但您的回答让我坚持了下来。缺少的部分是我没有深入研究,Intellisense 没有帮助我:

      Public mqtt_client As ManagedClient = New MqttFactory().CreateManagedMqttClient

      而不是

      Public mqtt_client As MQTTnet.ManagedClient.ManagedMqttClient = New MqttFactory().CreateManagedMqttClient
      

      也感谢您提供有关检查 Option Infer 的提示。

      感谢指点!

      【讨论】:

        猜你喜欢
        • 2021-01-21
        • 2022-11-19
        • 1970-01-01
        • 1970-01-01
        • 2011-05-16
        • 1970-01-01
        • 2011-07-05
        • 1970-01-01
        相关资源
        最近更新 更多