2017-08-17 65 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是其对象的最后一次实时引用,那么被引用的对象就有资格进行垃圾回收。

相关问题