【发布时间】:2020-11-27 20:18:59
【问题描述】:
我创建了一个类(下面的简化版):
public class UsbDevice
{
public UsbDevice()
{
Debug.WriteLine($"UsbDevice constructor called");
}
~UsbDevice()
{
Debug.WriteLine($"UsbDevice destructor called");
}
}
我使用字典来保存我所有 UsbDevices 的列表。
Dictionary<string, UsbDevice> _devices = new Dictionary<string, UsbDevice>();
UsbDevice usbDevice = new UsbDevice();
_devices.Add("Path of the device", usbDevice);
当我不再需要 UsbDevice 时,我将其从字典中删除。
_devices.Remove("Path of the device");
(为了简单起见,我省略了所有检查设备是否存在)
当我删除 UsbDevice 时,我看到没有调用析构函数。这仅在应用程序关闭时完成。所以这意味着 UsbDevice 对象仍然存在于内存中的某个地方,对吧?我知道 Dictionary 的“Remove”方法不会从内存中删除 UsbDevice,因为字典不知道 UsbDevice 是否可以在代码中的其他地方使用(引用)。
如何清除与 UsbDevice 相关的所有内存?如果我不摆脱那个内存,那么添加/删除周期会因为所有未使用的 UsbDevices 而增加内存使用量,对吧?我怎样才能避免这种情况?
【问题讨论】:
-
C# 不是那么基础:当调用终结器时
-
C# not 有析构函数。它借用了 C++ 的语法(不幸的是,因为它会引起不必要的混淆),但这些被称为终结器。区别很重要;绝大多数类不需要终结器,除了一些选择的围绕非托管资源的低级包装器(并且大多数这些类已经编写并且是框架的一部分)。如果需要对内存以外的内容进行确定性清理,其余所有用户都可以使用
IDisposable和using。 -
@knittl 谢谢!这确实有很大帮助!
标签: c# dictionary memory