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