gpt4 book ai didi

c# - 使用 ObjectDisposedException

转载 作者:太空狗 更新时间:2023-10-29 22:57:16 30 4
gpt4 key购买 nike

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

如果每个属性和方法在 setter 和 getter 的开头都有一行代码来抛出该异常,即使它只是 ThrowIfDisposed(),这似乎是很多重复的代码。如果您有 40 个属性,那就是 80 行重复行。在大类(class)中,它可以加起来非常快。

我一直没能找到更好的方法,所以它看起来就是这样,但我想我会问。有没有更好的办法?

最佳答案

如果你在一个类中有 40 个属性,那么你可能有设计问题,但继续......这真的取决于具体的用例,但你应该只在属性实际上不能抛出 ObjectDisposedException 时抛出得到解决,因为该类已被处置。举个具体的例子:

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 没有理由抛出。从那里,在许多情况下,您可以分解代码,以便访问实际有问题的属性会引发异常:

public int Length
{
get
{
// Since we access the Stream property, the ObjectDisposedException
// will be thrown when the class is disposed
return this.Stream.Length;
}
}

如果遵循此模式后仍有太多属性需要装饰,则可以使用像 Fody 这样的库。这允许您在编译时注入(inject)一个行为。使用它,您可以创建一个属性 [ThrowIfDisposed],您可以根据需要将其应用于属性。

关于c# - 使用 ObjectDisposedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40838791/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com