当use关键字与函数result一起使用时,Rises System.ObjectDisposedException

时间:2014-02-04 15:05:32

标签: f#

例如,

hashAlgorithm 返回 SHA1 。 执行时 bytesToHash 上升 System.ObjectDisposedException

let hashAlgorithm : HashAlgorithm =
    ConfigurationManager.AppSettings.Item("HashAlgorithm")
        |> CryptoConfig.CreateFromName :?> HashAlgorithm

let bytesToHash (bytes : byte[]) =
    bytes |>
        use hash = hashAlgorithm
        hash.ComputeHash

如果我改为

use hash = SHA1.Create()

然后一切正常。

如何更改 bytesToHash 功能以使用使用关键字?

1 个答案:

答案 0 :(得分:1)

问题可能是use阻止的范围。尝试

let bytesToHash (bytes:byte[]) =
    use hash = hashAlgorithm
    bytes |> hash.ComputeHash

在调用hash之后处理ComputeHash值并返回一个值。在您的代码中,hash在创建包装ComputeHash的函数值之后但在实际使用字节数组调用之前处理。

另一个问题是你只创建一次哈希算法,但可能会多次处理它,所以我希望除了第一次调用bytestToHash之外的所有内容都会失败。你可以像这样解决这个问题:

let hashAlgorithm() : HashAlgorithm = ...

let bytesToHash (bytes:byte[]) =
    use hash = hashAlgorithm()
    bytes |> hash.ComputeHash