处理 CryptoStream 是否会刷新最后一个块?

问题描述

可以从 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...