2015-11-09 95 views
1

我正在使用C#编写一个列表,其中将包含一个类的唯一实例。我想写一个函数来添加这个类的单个实例并返回一个指向它的指针。C#List添加并获取参考

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停止存在,列表的指针是否不再有效?

+1

只要有一个被引用的'Bag'实例,该实例就应该有弹珠列表 –

+1

'Marble m'将是一个引用类型 - 当它返回时它不会超出范围方法。请参阅Jon Skeet的这篇文章以获取更多信息 - http://jonskeet.uk/csharp/references。html – Tim

+0

在C#中,引用类型(在本例中就是这样)将始终由指针存储。不要担心被破坏的东西,你有垃圾收集器来做到这一点。 'return m'将返回指针,m将不会被销毁,直到你完成它。 – thijmen321

回答

2

不,列表指针会很好。 该列表包含您创建的Marble对象的引用,只要该列表包含此引用,并且没有您的任何干预,该引用将始终有效。另外,如果你由于某种原因决定从列表中删除引用,而没有其他引用它,那么引用将变成类似悬挂指针的东西,并且将由垃圾收集器自动收集,所以你不用在你的情况下也不需要清理干净。

请记住,你的大理石实例是一个reference type,这应该如何工作。

对于习惯于像C这样的语言的人来说,这可能听起来很神奇,除非Marble被放置在堆中(通过new,malloc和他们的类),否则你所做的将会成为问题。

0

将大理石m返回时超出范围?

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

据我所知,它只是一个动态数组指针。如果Marble停止存在,列表的指针是否不再有效?

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

要使用类比,请将变量视为一张纸。你在那张纸上写下一个地址。接下来,将这些纸片烧成灰烬。你的房子会发生什么?你的房子什么也没有发生;否认一次提及它绝不会影响房屋;如果因为其他原因(例如,在将其地址复制到另一张纸之前将其烧写),您仍然可以找到房子,并且摧毁纸张绝不会损坏房屋。