我知道这是在各种情况下提出的,但我没有找到这个确切的问题或令人满意的答案,抱歉,如果我不够谨慎的话。
症状:
当有嵌套对象时,就像Class A
引用Class B
有Class C
一个函数一样MyCall()
,我必须调用这个函数,但我不能确定是否有任何类被释放或为空,我通常使用Null-Conditional Operaton作为简化称呼:
myClassC?.myClassB?.myClassC?.MyCall();
这通常工作得很好,但在极少数情况下,运行会以NullReferenceException
.
例如,当ClientSession?.WebsocketConnection?.SocketConnection?.Disconnect()
在代码中的某处调用以断开客户端套接字时,就会发生这种情况,但是当此调用异步运行时,客户端远程断开连接,例如SocketConnection
类被释放。
所以竞争条件会导致一种情况,当 null 检查实际上可以到达最后的函数调用时,但是当执行发生时,链中的任何对象都变为 null,因此该方法无法执行,因此导致NullReferenceException
.
问题:
避免这种情况的正确方法应该是什么?不使用try/catch
,因为这是一个性能敏感的应用程序,而且关于我的基准测试,捕获这样的错误有点昂贵。
如果任何对象为空,是否有任何适当的方法可以取消执行?
感谢您的帮助。