You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用Dispose后是否应确保BleScanner对象无法再使用?

是否应在Dispose后让Start/Stop抛出ObjectDisposedException?

答案是应该遵循.NET生态的惯例,在Dispose被调用后,让Start、Stop等公共实例方法抛出ObjectDisposedException,理由如下:

  1. 对齐.NET类库的普遍行为
    虽然微软的Dispose模式指南只明确要求Dispose可多次调用不抛出异常,但.NET框架中几乎所有实现IDisposable的类,在Dispose后调用其他实例方法都会抛出ObjectDisposedException。比如Stream调用Read、Timer调用Start,都会触发这个异常。遵循这个惯例能让使用你类的开发者符合预期,避免困惑。

  2. 维护Dispose的语义一致性
    Dispose的核心语义是标记对象已完成生命周期,不应再被使用——哪怕内部的BluetoothLEAdvertisementWatcher还能工作,你的BleScanner作为包装类,Dispose调用后就应该对外呈现"已不可用"的状态。允许后续调用Start会模糊这个语义,让用户无法判断对象的有效状态。

  3. 实现简单且安全
    你只需要在类中添加一个私有布尔字段(比如_disposed),在Dispose方法中将其设为true,然后在Start、Stop方法开头增加检查:

    if (_disposed)
        throw new ObjectDisposedException(nameof(BleScanner));
    

    这个逻辑简单清晰,能有效阻止用户误用已释放的对象实例。

  4. 反思Dispose语义的合理性(可选)
    如果你的场景确实需要在Dispose后复用扫描功能,那可能需要重新审视BleScanner的Dispose设计:Dispose原本是用来释放非托管资源或终止对象生命周期的,而你的内部watcher不可释放,那Dispose里的逻辑是不是只是"停止扫描"?这种情况下,或许应该把停止扫描的逻辑拆成独立的Stop方法,让Dispose仅处理真正需要释放的资源(如果有的话),而不是标记对象为不可用。但如果已经按常规IDisposable语义实现,那还是优先遵循惯例抛出异常。

内容的提问来源于stack exchange,提问作者LWChris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:25:19