首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ObjectDisposedException

使用ObjectDisposedException
EN

Stack Overflow用户
提问于 2016-11-28 07:05:01
回答 2查看 1.4K关注 0票数 5

在实现Dispose模式时,对象的属性应该在释放对象之后抛出ObjectDisposedException。

如果每个属性和方法在setter和getter的开头都有一行代码来抛出异常,即使它只是ThrowIfDisposed(),那么似乎会有很多重复的代码。如果你有40个属性,那就是80条重复行。在一个大班里,它可以很快地加起来。

我一直没能找到更好的方法,所以似乎就是这样,但我想我会问。有更好的办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-28 07:16:12

如果一个类中有40个属性,那么可能存在设计问题,但是继续.它实际上取决于特定的用例,但只有在由于类已被释放而不能实际解析该属性时,才应该抛出ObjectDisposedException。举一个具体的例子:

代码语言:javascript
复制
public class MyStream : IDisposable
{
    private string name;
    private Stream stream;

    public MyStream(string name)
    {
        this.Name = name;
        this.Stream = new FileStream(...);
    }

    public string Name
    {
        get
        {
            return this.name;
        }
    }

    public Stream Stream
    {
        get
        {
            if (this.IsDisposed)
            {
                throw new ObjectDisposedException();
            }

            return this.stream;
        }
    }

    private bool IsDisposed { get; set; }

    public void Dispose()
    {
        if (!this.IsDisposed)
        {
            this.IsDisposed = true;
            this.Stream.Dispose();
            this.Stream = null;
        }
    }
}

在这里,属性Stream抛出一个异常,因为底层流已被释放,因此不能再使用它。但是Name没有理由扔。从这里开始,在许多情况下,您可以分解代码,以便访问实际存在问题的属性引发异常:

代码语言:javascript
复制
public int Length
{
    get 
    {
        // Since we access the Stream property, the ObjectDisposedException
        // will be thrown when the class is disposed
        return this.Stream.Length;
    }
}

如果您仍然有太多的属性需要修饰,即使在遵循这种模式之后,您也可以使用像福迪这样的库来在编译时注入一个行为。使用它,您可以创建一个属性[ThrowIfDisposed],并在需要时应用到属性上。

票数 8
EN

Stack Overflow用户

发布于 2016-11-28 07:16:36

查看其他主题:在ObjectDisposedException类层次结构中正确处理IDisposable

您不需要每次有人访问实现:IDisposable的类的属性时都抛出异常。只有当您访问必须释放的对象(例如,对文件的写/读、访问网络套接字、.)时,才有必要。对于所有其他情况,您只需使用idea普通类即可。

通常,对象/类没有这么多的属性,因为可以选择将它们拆分到更多的类( -> )中,这将只允许您生成这个:IDisposable的一部分,其余的将独立于IDisposable类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40838791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档