层次的使用一次性对象类。 对所有这些实现IDisposable?

我有一个使用文件流的类。 它需要在应用程序关闭,关闭流,所以我做的类实现IDisposable。

这个类是另一个类,它是另一个类等的成员一路到我主要的应用程序中的一员。

所以我一定要实现所有这些类IDisposable的?

如果我改变我的文件实现在未来,这样它关闭每个写操作之后的文件? 我现在有一个整体的一套实现IDisposable无故类。

我想我有crowbarring IDisposable的语义成具有不超过一些轻微的实现细节一路下滑链中的其他需要他们班不舒服。 是否有解决这个什么方法?

--------------解决方案-------------

一般来说,如果你的类型包含了实现一个成员IDisposable类型也应该实现IDiposable为好。 这是强制执行的最简单方法IDisposable格局。

唯一例外的我用的是如果我的类型的合同包含了这1)必须被调用的方法; 2)信号使用的年底IDisposable资源。 在这种情况下,我感觉很舒服不执行IDisposable ,而是使用该方法调用Dispose

如果你明确要处理的文件流,那么,你需要实现IDisposable上抱到你了IDisposable参考任何类。 如果是合理的处置FILESTREAM每次写入后,即不损害性能由于经常wries,听起来preferrable。

这取决于你如何实现使用FILESTREAM的类。 如果类创建文件流,那么就应该负责处理它。 但是,如果你要改变它,因此采取的方法在FILESTREAM作为参数,它将不再“拥有”的文件流,因此不负责处理它。

如果类是某种层次的一部分,您可以只需添加一个文件流为开始于顶部的一个参数,并将其介绍给所有的方法到它实际使用。

例如:

public class Class1
{
private readonly Class2 SomeObject = new Class2();

public void DoWork1(Filestream stream)
{
SomeObject.DoWork2(stream);
}
}

public class Class2
{
public void DoWork2(Filestream stream)
{
// Do the work required with the Filestream object
}
}

虽然我不知道我会用这种模式我自己,这将让你不必'IDisposable的“添加到任何类,除了最初创建文件流对象之一。

需要的一种实现IDisposable每个,但是,这并不一定需要在每个代码一个明确的实施。 让我们继承做的工作适合你。

两种方法:

class FileHandlingClass : IDisposable
{
private FileStream _stm;
/* Stuff to make class interesting */
public void Disposable()
{
_stm.Dispose();
}
/*Note that we don't need a finaliser btw*/
}

class TextHandlingClass : FileHandlingClass
{
/* Stuff to make class interesting */
}

现在,我们可以这样做:

using(TextHandlingClass thc = new TextHandlingClass())
thc.DoStuff();

等等

这一切工作,因为TextHandlingClass继承的唯一实现IDisposable它会永远需要。

它得到tricker如果我们有处理虽然需要进一步:

说,我们已经处理池类XmlNameTable对象(为什么这是一个好主意是另一个线程),并处理它返回的表到池中,它的使用XmlHandlingClass 。 现在,我们可以处理在某种程度上有:

class XmlHandlingClass : FileHandlingClass, IDisposable
{
PooledNameTable _table;
/* yadda */
public new void Dispose() // another possibility is explicit IDisposable.Dispose()
{
_table.Dispose();
base.Dispose();
}
}

现在,这与伟大工程:

using(XmlHandlingClass x = new XmlHandlingClass())
x.Blah();

但不与:

using(FileHandlingClass x = new XmlHandlingClass())
x.Blah()

仅在后一种情况下FileHandlingClass用于执行(不幸运地返回池名称表池是一件小事,大多数情况下Dispose()是更重要的)。 因此,如果需要覆盖是可能的,我们应该做的:

//Allow for Disposal override
class FileHandlingClass : IDisposable
{
private FileStream _stm;
/* Stuff to make class interesting */
public virtual void Disposable()
{
_stm.Dispose();
}
/*Note that we don't need a finaliser btw*/
}

//Still don't care here
class TextHandlingClass : FileHandlingClass
{
/* Stuff to make class interesting */
}

class XmlHandlingClass : FileHandlingClass
{
PooledNameTable _table;
/* yadda */
public override void Dispose()
{
_table.Dispose();
base.Dispose();
}
}

现在,我们在通话更安全Dispose()但仍然只需要它关系到实现它自己。

有一分钟的表演在第二种情况下打,但它确实是分钟。 我指点一下现在只来反对考虑在需要覆盖任何情况下,第一个Dispose()被视为甚至隐约似是而非。

在任何特定的时刻,每隔其中实现IDisposable应至少有一种类型的每个实例(通常只有一个),它可以预期调用Dispose它它不再需要一段时间后,与之前被完全并最终放弃了实体。 如果你的类型有一个IDisposable的一个领域,但别的东西可以预计处置任何IDisposable的实例,它可能是指的,那么你不应该调用Dispose那场自己。 如果你的类型有一个IDisposable的领域,没有人会为使用对象一旦你用它做,并没有其他人,预计处置它,那么你应该调用Dispose的对象,一旦你不再需要它。 在许多情况下,由于没有其他对象需要你,你的对象会发现出路是当别人调用Dispose它(​​随后它将调用Dispose的其他对象)的对象将需要其他的对象,直到这样的时间。

这有时是有用的一种模式是有一类暴露处置时调用它获取提出了一个处置事件。 如果,例如,其他对象,让你的对象IDisposable的一个参考,它需要一段时间,然后说给你了IDisposable被用它做对象,这非常有用。 它不能处理的对象,而你的目标仍然需要它,你的对象是不会处理它(因为你的对象将不知道这是否提供了IDisposable对象用它做)。 如果这给你的类了IDisposable挂钩到对象的处置处理程序类,但是,事件处理程序就可以注意到,您的对象不再需要了IDisposable,要么立刻处理它(如果你的对象是最后一个需要它)或设置一个标志,从而当其他用户与对象完成它会得到处置)。

它可以是有用的,如果你的对象将有一组特定的一次性的对象,它会保持其整个生命周期的另一种模式是保持IDisposable的对象的列表,然后在列表中有你的Dispose方法迭代和处置其中的东西。 名单上的每个项目应自己的try / catch块内进行处理; 如果出现异常,抛出具有第一或者最后一次例外,它的一个的InnerException CleanupFailureException(自定义类型),还包括发生作为一个自定义属性的所有异常的列表。

作为一个经验法则,当一个类型保存到一个参考IDisposable的实例字段,我让一次性过。 但我通常尽量避免在这种情况下发现自己; 如果可能的话,我尽量一次性处理在创建它们的相同的方法,具有using块。

分类:C# 时间:2015-03-15 人气:0
本文关键词: IDisposable的
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.351 (s). 10 q(s)