我有一个带有基础CryptoStreamStream。我不能使用using块来处理CryptoStream,因为这也处理了需要保持打开状态的基础Stream。解决方案似乎只是忽略CryptoStream而仅在需要时处置Stream。但是也许重要的是保留对CryptoStream的引用并进行处理以防止某些资源泄漏?

另外,即使我不处置CryptoStream,如果超出范围,GC也可能处置它,然后也处置基础的Stream(这还为时过早,因为我仍然需要Stream) ?

最佳答案

CryptoStream.cs (ln 695)

    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/

10-12 05:47