正确实现一次性模式 - 自动实现的属性

时间:2010-02-10 10:29:55

标签: .net idisposable automatic-properties

实施Dispose方法的一条规则是:

“当资源已经处理时,从此类型的实例方法(Dispose除外)抛出ObjectDisposedException。此规则不适用于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;
        }
    }

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

  

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

E.g。如果您的类的Dispose方法将某个字段设置为null,则应使用该字段从methods / properties中抛出ObjectDisposedException,而不是使用NullReferenceException失败。