2015-11-09 64 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只意味着一個引用不再存在;這並不意味着該變量的引用所引用的對象不再存在。

要使用類比,請將變量視爲一張紙。你在那張紙上寫下一個地址。接下來,將這些紙片燒成灰燼。你的房子會發生什麼?你的房子什麼也沒有發生;否認一次提及它絕不會影響房屋;如果因爲其他原因(例如,在將其地址複製到另一張紙之前將其燒寫),您仍然可以找到房子,並且摧毀紙張絕不會損壞房屋。