C#List添加并获取参考

时间:2015-11-09 20:42:44

标签: c# list

我正在使用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;
    }
}

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

2 个答案:

答案 0 :(得分:2)

不,列表指针就好了。 该列表包含对您创建的Marble对象的引用,只要该列表包含此引用,而没有您的任何干预,引用将始终有效。

此外,如果由于某种原因决定从列表中删除引用,并且没有其他任何引用它,那么引用将变成类似悬挂指针的东西,并且将由垃圾收集器自动收集,所以你不要你需要清理你的情况。

请记住,您的Marble实例是reference type,以及它应该如何工作。

对于习惯于像C这样的语言的人来说,这可能听起来很神奇,除非将Marble放入堆中(通过new,malloc及其类型),否则你所做的就是问题。

答案 1 :(得分:0)

  返回时

大理石m会超出范围吗?

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

  

据我了解Lists,它只是一个动态的指针数组。如果Marble m不再存在,列表的指针是否不再有效?

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

使用类比,将变量视为一张纸。你在那张纸上写了一个地址。接下来,你将那些纸片烧成灰烬。你的房子怎么了?你的房子什么都没发生;一个人提到它并不会影响房子;如果您因为其他原因而拥有房屋的地址(比如说你在烧毁之前将地址复制到另一张纸上),你仍然可以找到房子,并且破坏纸张不会损坏房屋。