我正在尝试模拟一些文件操作。在“真实”对象中,我有:

StreamWriter createFile( string name )
{
  return new StreamWriter( Path.Combine( _outFolder, name ), false, Encoding.UTF8 ) );
}

我想在模拟对象中拥有:
StreamWriter createFile( string name )
{
  var ms = new MemoryStream();
  _files.Add( Path.Combine( _outFolder, name ), ms );
  return new StreamWriter( ms, Encoding.UTF8 ) );
}

其中_files是用于存储创建的文件以供以后检查的字典。

但是,当使用者关闭StreamWriter时,它也会处理MeamoryStream ... :-(

关于如何追求这一点的任何想法?

最佳答案

如果将MemoryStream子类化,则可以使用,但是必须调用ManualDispose方法以关闭基础流。
我不确定,但是我认为该对象超出范围时将被垃圾回收。

public sealed class ManualMemoryStream : MemoryStream
{
    protected override void Dispose(bool disposing)
    {
    }
    public void ManualDispose()
    {
        base.Dispose(true);
    }
}

编辑:
如果您希望刷新MemoryStream并准备从顶部读取它,则这是一种替代方法。
public sealed class ManualMemoryStream : MemoryStream
{
    protected override void Dispose(bool disposing)
    {
        Flush();
        Seek(0, SeekOrigin.Begin);
    }
    public void ManualDispose()
    {
        base.Dispose(true);
    }
}

关于.net - 避免处置底层流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2620851/

10-17 01:14