2017-08-17 75 views
-3

你已經有了一個簡單的類:是一個對象的引用是否爲值類型的變量?

public class foo { 
    public object Property { get; set; } 

    public void AMethod() { 
     Property = new object(); 
     object x = Property; 
    } 
} 

正如我們所知,物業屬性具有保存對象引用一個隱藏的後備字段。問題是:是否支持字段像結構一樣處理?

我的意思是分配在堆棧上的x的內存?它是否收集垃圾?或者當方法返回時被釋放?

編輯

我的評論,而不是回答的,因爲這裏的文本太長,以適應評論。

我對x有興趣。我不知道.Net框架中的任何類名爲「ObjectReference」。所有討論的人都是「我有一個對象的引用」,並且使用引用調用對象的方法。

事實是,對象的引用和對象本身並不是同一個東西。他們都佔據不同的記憶塊。當你將一個對象作爲參數傳遞給一個方法時,你不會傳遞該對象,而是引用它。該引用從「ObjectReference」變量複製到堆棧。

參考文獻是非常重要的。你不能操縱沒有一個的對象;甚至「this」(或者當你訪問它內部的對象成員時隱含的「this」)實際上是對象佔據的特定內存塊的引用。

我不認爲很多人對引用作爲單獨的實體有任何想法。它們無處不在,如果沒有它們,你就無法做任何事情。

所以我想要在這裏是,如果有一個ObjectReference類,它會是一個結構?它看起來像參考本身的內存被視爲一個結構。

+1

x在方法超出範圍時被釋放。 x基本上持有對當前存儲在Property中的對象/值的引用。 – Nkosi

+1

你問'x'還是'Property'?還是「財產」的隱藏支持領域? – mjwills

+0

你顯然知道'struct'和「在堆棧上分配」是完全無關的...只是檢查...(我的信封估計值將是堆中分配的所有struct的33%) –

回答

2

我的意思是x分配在堆棧上的內存?

是的,內存x,其中包含引用object,被分配在堆棧上 - 很像有他們語言的指針。

它是否收集垃圾?或者當方法返回時被釋放?

只要方法返回,引用本身的內存就會立即釋放。如果x是其對象的最後一次實時引用,那麼被引用的對象就有資格進行垃圾回收。

相關問題