.NET对象设计:硬件处理&垃圾收集

时间:2014-01-30 12:24:54

标签: c# .net garbage-collection

我正在开发一个.NET库,以便.NET代码轻松使用LibTiePie

相关库代码(C#):

using Handle = UInt32;

public static class API
{
    [DllImport(@"libtiepie.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern void DevClose(Handle device);
};

public class Device
{
    protected Handle _handle;

    public Device(Handle handle)
    {
        _handle = handle;
    }

    ~Device()
    {
        API.DevClose(_handle);
    }
}

程序代码(C#):

Device dev = new Device( some_valid_open_handle );

// Do something useful with dev

dev = null; // How can I make sure that the handle is closed now, as the GC may not cleanup it directly?

我可以添加Close方法Device类,在发布引用之前可以调用它。但是奇怪的是有更好的.NET方法来实现它吗?

1 个答案:

答案 0 :(得分:2)

实施IDisposable界面。

消费者可以这样做:

using (Device d = new Device(handle)) 
{ 
    ... 
} 

这将确定底层句柄的关闭。另请参阅using关键字的文档。

不是在终结器中调用API.DevClose(_handle),而是在Dispose()中执行此操作。 MSDN链接有一个很好的例子,说明如何使用此模式来关闭本机句柄。