我有,一般会从数据构建的Stream
对象的小的分层次,但对于一些特定的子类,可以从一个简单的参数列表来合成。在从子类链接构造函数时,我遇到了确保处理基类构造函数所需的合成流的问题。它不逃避我这种方式使用IDisposable
对象可能只是肮脏的池(PLZ建议?)由于我没有考虑的原因,但除了这个问题,它似乎相当简单(和良好的封装)。传递IDisposable的对象,通过构造函数链
代码:
abstract class Node {
protected Node (Stream raw)
{
// calculate/generate some base class properties
}
}
class FilesystemNode : Node {
public FilesystemNode (FileStream fs)
: base (fs)
{
// all good here; disposing of fs not our responsibility
}
}
class CompositeNode : Node {
public CompositeNode (IEnumerable some_stuff)
: base (GenerateRaw (some_stuff))
{
// rogue stream from GenerateRaw now loose in the wild!
}
static Stream GenerateRaw (IEnumerable some_stuff)
{
var content = new MemoryStream();
// molest elements of some_stuff into proper format, write to stream
content.Seek (0, SeekOrigin.Begin);
return content;
}
}
我认识到,没有设置一MemoryStream
的是不完全的坏CLR公民的世界停止的情况下,但它仍然让我神经过敏(更不用提,我可能并不总是使用其他子类型的MemoryStream
)。这不是在范围上,所以我不能明确地Dispose()
后来在构造函数中,并加入在GenerateRaw()
一个using
语句是弄巧成拙,因为我需要的流返回。
有没有更好的方法来做到这一点?
先发制人:
- 是,在
Node
构造计算的性质应该是基类的一部分,不应该由(或接近)来计算的子类 - 我不会要求流被传递到CompositeNode(其格式应该无关的呼叫者)
- 先前迭代不得不在基类中的值计算作为一个单独的受保护的方法,该方法我那么就称为在每个亚型的构造的端,将
GenerateRaw()
的主体转化为一个使用CompositeNode
构造函数体中的语句。但要求呼吁每个构造,不能够的重复,以保证它的每一个亚型永远运行(一Node
不是Node
,语义,如果没有这些属性进行初始化)给了我神经过敏远远高于糟糕(潜力)资源泄漏在这里呢。
我知道这是一个老问题,但如果你还记得。 。为什么你没有在构造函数参数中使用字节数组而不是流? – Oscar 2017-10-18 22:11:04