【问题标题】:Implementing Disposable pattern correctly - auto-implemented properties正确实现 Disposable 模式 - 自动实现的属性
【发布时间】:2010-02-10 10:29:54
【问题描述】:

实现Dispose 方法的规则之一是:

当资源已经被释放时,从这种类型的实例方法中抛出一个ObjectDisposedExceptionDispose 除外)。此规则不适用于Dispose 方法,因为它应该可以多次调用而不会引发异常。

见:http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx

这是否意味着如果我想正确实现属性,就不能使用自动实现的属性?我需要像这样实现它的属性吗?

private bool _property; 
public bool Property
{
    get
    {
       if(disposed) throw new ObjectDisposedException("MyClass");
       return _property;
    }
    set
    {
       if(disposed) throw new ObjectDisposedException("MyClass");
       _property=value;
    }
}

【问题讨论】:

    标签: .net idisposable automatic-properties


    【解决方案1】:

    通常,属性应该像字段一样(很少或没有计算,如果没有其他状态发生变化,则在多次调用中返回相同的值),因此它们不需要完整的处置检查,但您应该检查已定义的公共类中的方法。

    【讨论】:

    • 我同意。当您只是返回原始值时,例如整数、布尔值、颜色:不要费心进行完整的处置检查。但是,当该属性返回一些在处理后无法合理使用的对象时,请进行全面检查。
    【解决方案2】:

    这取决于。调用已处置的对象是一种边缘条件,因此您通常不希望在常规使用期间通过添加所有这些测试来牺牲对象的效率。 阅读规则的正确方法是:

    如果在 Disposed 上调用已释放的方法会导致异常或产生不良后果,则抛出 ObjectDisposedException

    例如如果您的类的 Dispose 方法将某些字段设置为 null,您应该使用该字段从方法/属性中抛出 ObjectDisposedException,而不是使用 NullReferenceException 失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多