2

从 Microsoft .NET API 可以提取以下信息:

  • using将调用执行IDisposable.Dispose()
  • IDisposable.Dispose()应该调用Flush()任何Stream实例;
  • CryptoStream.Close()会打电话CryptoStream.FlushFinalBlock()

然而,这似乎在规范中留下了一个空白:处理一个CryptoStream实例也会调用CryptoStream.FlushFinalBlock(),如果是这样,这在哪里记录?

4

1 回答 1

2

Dispose()FlushFinalBlock()如果尚未调用,则调用。这也在文档中,但不是集中的,而是分布式的:

CryptoStreams不重载Close()或(无参数) public 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...

于 2021-07-01T07:53:32.077 回答