我有一个基础为CryptoStream
的{{1}}。我无法使用Stream
块来处置using
,因为它还会释放我需要保持打开的基础CryptoStream
。解决方案似乎只是忽略Stream
,只需在需要时处理CryptoStream
。但也许重要的是保持对Stream
的引用并处理它以防止一些资源泄漏?
此外,即使我没有处置CryptoStream
,如果GC超出范围,GC也可以处置它,然后处理基础CryptoStream
,(因为我太早了)还需要Stream
)吗?
答案 0 :(得分:1)
protected override void Dispose(bool disposing) {
try {
if (disposing) {
if (!_finalBlockTransformed) {
FlushFinalBlock();
}
_stream.Close();
}
}
finally {
try {
// Ensure we don't try to transform the final block again if we get disposed twice
// since it's null after this
_finalBlockTransformed = true;
// we need to clear all the internal buffers
if (_InputBuffer != null)
Array.Clear(_InputBuffer, 0, _InputBuffer.Length);
if (_OutputBuffer != null)
Array.Clear(_OutputBuffer, 0, _OutputBuffer.Length);
_InputBuffer = null;
_OutputBuffer = null;
_canRead = false;
_canWrite = false;
}
finally {
base.Dispose(disposing);
}
}
}
如您所见,如果您不想处置FlushFinalBlock
,则应调用公开的CryptoStream
方法。此方法清除输入缓冲区和输出缓冲区,因此在使用的CryptoStream
中不会存储敏感信息。
GC可能会关闭基础Stream
吗?不。为此,必须使用Dispose
作为参数值调用true
方法,但这仅在Stream.Close
方法(从Stream.Dispose
调用)中完成。即使CryptoStream
实现终结器,在执行Dispose
时对引用的对象调用Finalize
也不是一个好习惯。终结者应仅用于释放非托管资源。