想象一下,如果我有方法(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的建议),现在我会这样使用它?!
答案 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()
时声明并使用新变量可能会更具可读性它不再需要时。