'F# Equivalent of Destructor
I am translating 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.
Solution 1:[1]
Have you tried looking for F# finalizer?
override x.Finalize() = ...
Solution 2:[2]
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
Solution 3:[3]
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.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | GregC |
Solution 2 | |
Solution 3 | Andrii |