C#列表添加并获取引用

本文关键字:获取 引用 添加 列表 | 更新日期: 2023-09-27 18:21:19

我正在使用C#编写一个包含类的唯一实例的列表。我想写一个函数,添加这个类的一个实例,并返回一个指向它的指针

public class Marble 
{
    public Marble(int ID) 
    {
    // Initialize based on unique ID
    }
}
public class Bag 
{
    private List<Marble> marbles = new List<Marble>();
    public Marble Add(int ID) 
    { 
        Marble m = new Marble(ID);
        marbles.Add(m);
        return m;
    }
}

这似乎比添加新的大理石并搜索匹配的ID更优化。然而,大理石m在返回时会超出范围吗?正如我所理解的Lists,它只是一个指针的动态数组。如果Marble m不存在,列表的指针会不再有效吗?

C#列表添加并获取引用

不,列表指针会很好。该列表包含对您创建的大理石对象的引用,只要该列表包含该引用,而无需您进行任何干预,该引用将始终有效。

此外,如果您出于某种原因决定从列表中删除引用,而没有其他引用,那么该引用将变成一个悬挂指针,并将由垃圾收集器自动收集,因此您也不需要进行清理。

请记住,您的Marble实例是一个引用类型,它应该是这样工作的。

对于一个习惯了C这样的语言的人来说,这听起来可能很神奇,除非Marble被放在堆里(通过new、malloc和他们的同类),否则你所做的事情将是一个问题。

Marble m返回时会超出范围吗?

是的,绝对会的。它是该方法的局部变量;它的作用域是用于该方法调用的,因此当该方法返回该变量时,它就超出了作用域。碰巧,在这种特殊情况下,当变量返回时,该变量的生存期也结束,因此该变量将能够在该时间点被清理。理论上,变量的寿命可能与其范围不同,但在本例中并非如此。有关差异的详细分析,请参阅本文。

正如我所理解的Lists,它只是一个指针的动态数组。如果Marble m不存在,列表的指针会不再有效吗?

它绝对有效。失去变量m只是意味着一个引用不再存在;这并不意味着变量引用引用的对象不再存在。

打个比方,把变量想象成一张纸。你在那张纸上写一个地址。接下来你把那张纸烧成灰烬。你的房子怎么了?你的房子什么事也没发生;销毁一个提到它的东西对房子没有任何影响;如果你有房子的地址是因为其他原因(比如你在焚烧之前把地址复制到了另一张纸上),你仍然可以找到房子,销毁纸不会损坏房子。