我在F#中创建了一个实现IDisposable接口的类。该类被正确清理,use关键字能够访问Dispose方法。我有第二个用例,我需要显式调用Dispose方法,我无法在下面的示例中。似乎在课堂上没有使用Dipose方法。
open System
type Foo() = class
do
()
interface IDisposable with
member x.Dispose() =
printfn "Disposing"
end
let test() =
// This usage is ok, and correctly runs Dispose()
use f = new Foo()
let f2 = new Foo()
// The Dispose method isn't available and this code is not valid
// "The field , constructor or member Dispose is not defined."
f2.Dispose()
test()
答案 0 :(得分:10)
在F#类中实现接口更类似于C#中的显式接口实现,这意味着接口的方法不会成为方法的公共类。要调用它们,您需要将类强制转换为接口(不能失败)。
这意味着,要调用Dispose
,您需要写:
(f2 :> IDisposable).Dispose()
实际上,这不是经常需要的,因为use
关键字确保在值超出范围时自动调用Dispose
,所以我会写:
let test() =
use f2 = new Foo()
f2.DoSomething()
此处,当f2
函数返回时,test
会被释放。
答案 1 :(得分:1)
托马斯说得对。仅供参考,您可以在类型上实现Dispose()函数以便于使用:
member x.Dispose() = (x :> IDisposable).Dispose()
那是在之外的<{1}}的实现。然后你可以写IDisposable
。