F# Equivalent of Destructor
I am t开发者_运维百科ranslating a C# class that wraps an unmanaged library to F#. I have run into the seemingly simple problem of rewriting the destructor that follows.
class Wrapper {
// P/Invoke ellided
private SomeType x;
public Wrapper() {
x = new SomeType();
Begin();
}
public ~Wrapper() {
End();
}
The simplified F# code I have at this point is as follows:
type Wrapper() =
[<Literal>]
static let wrappedDll = "Library.dll"
[<DllImport(wrappedDll , EntryPoint = "Begin")>]
static extern void Begin()
[<DllImport(wrappedDll , EntryPoint = "End")>]
static extern void End()
let x = new SomeType()
do
Begin()
How can I modify this F# code to have the same behaviour? My search for F# destructor turned up no results in the books I have or on the web.
Thank you.
Have you tried looking for F# finalizer?
override x.Finalize() = ...
namespace FSharp.Library
type MyClass() as self =
let mutable disposed = false;
// TODO define your variables including disposable objects
do // TODO perform initialization code
()
// internal method to cleanup resources
let cleanup(disposing:bool) =
if not disposed then
disposed <- true
if disposing then
// TODO dispose of managed resources
()
// TODO cleanup unmanaged resources
()
// implementation of IDisposable
interface IDisposable with
member self.Dispose() =
cleanup(true)
GC.SuppressFinalize(self)
// override of finalizer
override self.Finalize() =
cleanup(false)
F# Class Library Template
http://blogs.msdn.com/b/mcsuksoldev/archive/2011/06/05/f-class-library-template.aspx
I think it must be defined the same as C# compiler does
override c.Finalize() =
try
// do finalization
finally
base.Finalize()
Because exception in your finalization code can corrupt something. Otherwise I misunderstand why C# does that.
精彩评论