将该流的位置设置为0后,重新初始化相同的MemoryStream

时间:2016-04-21 05:14:48

标签: c#

想象一下,如果我有方法(IDisposable已实现),我的私有字段是在构造函数中初始化的MemoryStream,这是一个问题。

我的IDisposable会清理所有资源吗?

声明它一次私有并在构造函数中初始化一次:

private myMemoryStream;

MyConstructor(){
_myMemoryStream= new MemoryStream();
}

在每种方法中重复使用它:

_myMemoryStream.Position=0;
_myMemoryStream = ...; //new stream

清理(我班上实施的IDisposable):

   public void Dispose()
    {
        if (_myMemoryStream != null)
        {
            _myMemoryStream.Close(/*todo: true oder false*/);
            _myMemoryStream.Dispose();
        }
    }

在不同的上下文中使用该类,我会在其周围添加using

更新了我的问题(基于@Oscar Vicente Perez的建议),现在我会这样使用它?!

2 个答案:

答案 0 :(得分:3)

  

Field!= Object

     

字段==参考

字段只是说存储对象的位置,而不是存储对象本身。但是你只是在改变参考点的位置,忘记了第一个MemoryStream。通过这样做,您可以将MemoryStream清除到Garbage Collector,并且可以解决一些性能问题。

最快的解决方案是在将其引用设置为null之前关闭/处理当前的MemoryStream 。此外,如果您只是想在写入之后转到流的开头阅读它,您可以使用stream.Position = 0

  

不要使用类字段来保存引用每个方法中不同对象的临时变量。

而不是:

private Stream field;

public void Method1()
{
    field = new Stream();
    ...
}

public void Method2()
{
    field = new Stream();
    ...
}

使用这种方法:

public void Method1()
{
    using(Stream field = new Stream())
    {       
        ...
    }
}

public void Method2()
{
    using(Stream field = new Stream())
    {       
        ...
    }
}

答案 1 :(得分:0)

当你完成它后,你应该Close() /明确地处理它,然后如果你真的想将它设置为null。重新初始化相同的字段/变量不会导致任何问题。

这就引出了一个问题,为什么你以这种方式“重用”你的领域?如果您的班级中MemoryStream不需要相同的实例,那么在您需要和Close()时声明并使用新变量可能会更具可读性它不再需要时。