Я разрабатываю .NET-библиотеку для удобства использования кода LibTiePie по .NET.Дизайн объекта .NET: аппаратные ручки и сборщик мусора
Соответствующий код библиотеки (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?
Внедрите шаблон IDisposable. Затем потребители могут: «использовать (устройство d = новое устройство (дескриптор)) {...}' и получить детерминированное закрытие основного дескриптора – jglouie
@jglouie: сделать этот ответ до того, как кто-то еще сделает –
Возможно, я ошибаюсь, но я подумайте, что вы хотите использовать 'IntPtr', а не' UInt32' для типа 'Handle'. – Lukazoid