gpt4 book ai didi

c# - 想知道一种在 C# 中使用 List<> 和结构来节省内存的方法

转载 作者:行者123 更新时间:2023-11-30 16:34:19 24 4
gpt4 key购买 nike

我什至不确定该如何表述这个问题。我将一些 CustomStruct 对象作为参数传递给类方法,并将它们存储在列表中。我想知道的是,如果找到一个等效实例,是否有可能并且更有效地添加对 CustomStruct 的特定实例的多个引用。

这是一个虚拟/示例结构:

public struct CustomStruct
{
readonly int _x;
readonly int _y;
readonly int _w;
readonly int _h;
readonly Enum _e;
}

使用下面的方法,您可以传递一个、两个或三个 CustomStruct 对象作为参数。在最后一个方法(采用三个参数)中,第三个和第二个可能与第一个具有相同的值。

List<CustomStruct> _list;

public void AddBackground(CustomStruct normal)
{
AddBackground(normal, normal, normal);
}

public void AddBackground(CustomStruct normal, CustomStruct hover)
{
AddBackground(normal, hover, hover);
}

public void AddBackground(CustomStruct normal, CustomStruct hover, CustomStruct active)
{
_list = new List<CustomStruct>(3);
_list.Add(normal);
_list.Add(hover);
_list.Add(active);
}

就目前的方法而言,我相信它将创建 CustomStruct 对象的新实例,然后将每个对象的引用添加到列表中。

据我了解,如果我改为检查 normalhover 之间是否相等,并且(如果相等)再次插入 normal 代替hover,当方法完成时,hover 将丢失所有引用并最终被垃圾回收,而 normal 将在列表中有两个引用。对于 active 也可以这样做。

那会更好,对吧? CustomStruct 是一种 ValueType,因此一个实例将保留在 Stack 上,三个 List 引用将仅指向它。列表的整体大小不是由包含的对象类型决定的,而是由它的容量决定的。通过消除“重复的”CustomStuct 对象,您可以清理它们。

当 CustomStruct 对象被传递给这些方法时,每次都会创建新的实例。当结构被添加到列表中时,是否制作了另一个副本?例如,如果我只传递一个 CustomStruct,AddBackground(normal) 创建原始变量的副本,然后将它传递三次到 Addbackground(normal、hover、active)。在这种方法中,原始副本制作了三个副本。当使用 Add() 将三个局部变量添加到 List 时,是否会在 Add() 内部创建额外的副本,这是否违反了前面提到的任何相等性检查的目的?

有没有更好的方法来处理这个问题?是否应该将结构作为对方法的引用来传递以解决此问题?

我在这里遗漏了什么吗?

最佳答案

您在同一行中谈论垃圾回收和结构,这没有意义。最终,每次您查看 结构时,它都可能会复制自身。如果您想重复使用相同的引用,那么您要么需要一个类,要么需要将结构包装在一个类中(装箱;内置或手动)。

您的代码中实际发生的是:

_list.Add(normal); // a **copy** of normal is set into the list
_list.Add(hover); // a **copy** of hover is set into the list
_list.Add(active); // a **copy** of active is set into the list

当你想到它时(空间方面)等同于:

_list.Add(normal); // a **copy** of normal is set into the list
_list.Add(normal); // a **copy** of normal is set into the list
_list.Add(normal); // a **copy** of normal is set into the list

请注意,副本不会进入堆栈(struct=stack 是一个常见的神话)。数据进入堆上的数组(在 List<> 内)。通过引用传递结构对 Add 的行为无论如何都没有影响。 (它只是避免在将结构传递给 this 方法时复制结构,但内存复制速度很快)。

关于c# - 想知道一种在 C# 中使用 List<> 和结构来节省内存的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2497722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com