在 C# 中删除数据结构和释放内存的有效方法(垃圾收集)
Efficient way to Delete Data-Structures and Release Memory in C# (Garbage Collection)
想象一个由多个嵌套(标准)容器组成的数据结构,如下所示。
示例:
var data = new Dictionary<int, HashSet<float>>()
{
{
0, new HashSet<float>() { 1F, 2F, }
},
{
1, new HashSet<float>() { 3F, 4F, }
},
};
data.Remove(0);
完全删除顶层Dictionary
(包括HashSet
内的嵌套元素)的一个值的正确方法是什么?内存应该被释放,应该没有泄漏。
data.Remove(0)
是否是最好的方法,因为垃圾回收会自动完成所有工作?
没有区别。垃圾收集器是释放内存的唯一方法。 IDisposable 仅用于允许对象(在调用它后仍然存在)释放非托管资源(可以是非托管内存、文件句柄等),它对托管内存没有影响。
事实上,现代 C# 8 nullable/non 可为 null 的引用类型实际上阻碍了 "just" 将变量设置为 null 的方式。
删除字典的所有键不会释放任何内存,无论如何您都必须等待垃圾收集器。
想象一个由多个嵌套(标准)容器组成的数据结构,如下所示。
示例:
var data = new Dictionary<int, HashSet<float>>()
{
{
0, new HashSet<float>() { 1F, 2F, }
},
{
1, new HashSet<float>() { 3F, 4F, }
},
};
data.Remove(0);
完全删除顶层Dictionary
(包括HashSet
内的嵌套元素)的一个值的正确方法是什么?内存应该被释放,应该没有泄漏。
data.Remove(0)
是否是最好的方法,因为垃圾回收会自动完成所有工作?
没有区别。垃圾收集器是释放内存的唯一方法。 IDisposable 仅用于允许对象(在调用它后仍然存在)释放非托管资源(可以是非托管内存、文件句柄等),它对托管内存没有影响。
事实上,现代 C# 8 nullable/non 可为 null 的引用类型实际上阻碍了 "just" 将变量设置为 null 的方式。
删除字典的所有键不会释放任何内存,无论如何您都必须等待垃圾收集器。