Я знаю, что это задают в различных ситуациях, но я не нашел этот точный вопрос или удовлетворительные ответы, извините, если я не был достаточно осторожен.
Симптомы:
При наличии вложенных объектов, например, Class A
, имеющий ссылку на Class B
, имеющий ссылку на Class C
, имеющий функцию, подобную MyCall()
, и я должен вызвать эту функцию, но я Я не могу быть уверен, что какой-либо из классов был удален или обнулен, я обычно использую Нулевой условный оператор в качестве упрощенного вызова:
myClassC?.myClassB?.myClassC?.MyCall();
Это обычно работает просто отлично, но в очень в редких случаях выполнение останавливается с NullReferenceException
.
Это происходит, когда, например, где-то в коде вызывается ClientSession?.WebsocketConnection?.SocketConnection?.Disconnect()
, чтобы отключить сокет клиента, но пока этот вызов выполняется асинхронно, клиент удаленно отключается, и например, SocketConnection
класс удаляется.
Таким образом, условие гонки вызывает ситуацию, когда нулевая проверка фактически может дойти до вызова функции в конце, но когда выполнение происходит любым объект в цепочке становится нулевым, поэтому метод не может быть выполнен, поэтому вызывает NullReferenceException
.
Вопрос:
Что должно быть правильным способом, чтобы избежать эта ситуация? Без использования try/catch
, потому что это приложение, чувствительное к производительности, и с точки зрения моих тестов, обнаружение ошибки вроде этого довольно дорого.
Есть ли какой-нибудь правильный способ отменить выполнение, если какой-либо объект обнуляется?
Спасибо за помощь.