Проблема с областью обработчика событий

Я боролся с этим часами. Надеюсь, некоторые из вас гуру 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

Сбой 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 подключаются нормально, но тогда объект имеет только область видимости внутри подпрограммы и не может быть доступен из другого модуля.

Я не могу поместить ВСЕ этот код за пределы вмещающего блока, так как addhandler является методом и не будет работать там.

Как я должен идти об этом? Любое руководство будет с благодарностью получено.

2 ответа

Вывод типа работает только для локальных переменных, поэтому пока это дает mqtt_client тип .CreateManagedMqttClient с Option 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

Укажите явный тип для поля с As и включить Option Explicit на уровне проекта, чтобы избежать будущих проблем. (Option Explicit а также Option Strict всегда должен быть включен для всех источников.)

@ Райан Спасибо. Ранее я уже пытался набрать mqtt_client AS ManagedClient, и это не помогло, но ваш ответ заставил меня упорствовать. Недостатком было то, что я недостаточно углубился, а Intellisense мне не помогал:

Открытый mqtt_client As ManagedClient = New MqttFactory().CreateManagedMqttClient

вместо

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

Спасибо за подсказку о проверке Option Infer.

Спасибо за указатель!

Другие вопросы по тегам