问题描述
可以从 Microsoft .NET API 中提取以下信息:
-
using
将调用Idisposable.dispose()
的实现; -
Idisposable.dispose()
应在任何Flush()
实例上调用Stream
; -
CryptoStream.Close()
将调用CryptoStream.FlushFinalBlock()
。
然而,这似乎在规范中留下了一个空白:处理 CryptoStream
实例是否也会调用 CryptoStream.FlushFinalBlock()
,如果是这样,这在何处记录?
解决方法
Dispose()
调用 FlushFinalBlock()
如果它尚未被调用。这也在文档中,但不是集中式的,而是分布式的:
CryptoStreams
不会重载 Close()
或(无参数)公共 Dispose()
,因此调用 Stream
类的实现。
Stream#Dispose()
(s. Remarks) 的文档说明:
此方法通过将任何更改写入后备存储并关闭流以释放资源来处置流。
这与源代码(来自 .NET Framework 4.8)一致。 Stream#Dispose()
调用 Stream#Close()
。
CryptoStream#FlushFinalBlock()
(s. Remarks) 的文档说(如您所描述的):
调用 Close 方法将调用 FlushFinalBlock。
这再次与源代码(来自 .NET Framework 4.8)一致。 Close()
调用(除其他外)受保护的(虚拟)重载 Dispose(true)
,它在 CryptoStream
中被覆盖,参见 CryptoStream#Dispose(bool disposing)
,如果它调用 FlushFinalBlock()
尚未被调用(即取决于 _finalBlockTransformed
),
CryptoStream#Dispose(Boolean)
(s. Remarks) 中描述了这些详细信息:
此方法由公共 Dispose() 方法和 Finalize 方法调用。 Dispose() 调用受保护的 Dispose(Boolean) 方法,并将 disposing 参数设置为 true...