我有一个带有基础CryptoStream
的Stream
。我不能使用using
块来处理CryptoStream
,因为这也处理了需要保持打开状态的基础Stream
。解决方案似乎只是忽略CryptoStream
而仅在需要时处置Stream
。但是也许重要的是保留对CryptoStream
的引用并进行处理以防止某些资源泄漏?
另外,即使我不处置CryptoStream
,如果超出范围,GC也可能处置它,然后也处置基础的Stream
(这还为时过早,因为我仍然需要Stream
) ?
最佳答案
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
也不是一个好习惯。终结器仅应用于释放非托管资源。关于c# - 处置CryptoStream与处置基础Stream?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45401733/