在实现Dispose模式时,对象的属性应该在释放对象之后抛出ObjectDisposedException。
如果每个属性和方法在setter和getter的开头都有一行代码来抛出异常,即使它只是ThrowIfDisposed(),那么似乎会有很多重复的代码。如果你有40个属性,那就是80条重复行。在一个大班里,它可以很快地加起来。
我一直没能找到更好的方法,所以似乎就是这样,但我想我会问。有更好的办法吗?
发布于 2016-11-28 07:16:12
如果一个类中有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;
}
}如果您仍然有太多的属性需要修饰,即使在遵循这种模式之后,您也可以使用像福迪这样的库来在编译时注入一个行为。使用它,您可以创建一个属性[ThrowIfDisposed],并在需要时应用到属性上。
发布于 2016-11-28 07:16:36
查看其他主题:在ObjectDisposedException类层次结构中正确处理IDisposable
您不需要每次有人访问实现:IDisposable的类的属性时都抛出异常。只有当您访问必须释放的对象(例如,对文件的写/读、访问网络套接字、.)时,才有必要。对于所有其他情况,您只需使用idea普通类即可。
通常,对象/类没有这么多的属性,因为可以选择将它们拆分到更多的类( -> )中,这将只允许您生成这个:IDisposable的一部分,其余的将独立于IDisposable类。
https://stackoverflow.com/questions/40838791
复制相似问题