参考类型

时间:2011-05-16 08:20:51

标签: .net

 var a = MyClassInstance;
    MyClassInstance = null;
    //if (a !=null){ //why }

我认为a指向MyClassInstanceMyClassInstance等于null,那么a也必须等于null。但是a不是空的,我不明白为什么。

4 个答案:

答案 0 :(得分:5)

aMyClassInstance是对象的引用 更改一个引用不会改变另一个引用。

var a = MyClassInstance; // Both references point to the same object
MyClassInstance = null;  // MyClassInstance now points to null, a is not affected

答案 1 :(得分:4)

变量a是一个引用,因此它保存的值是某个对象的“位置”。 MyClassInstance也是一个参考。通过设置a = MyClassInstance,它们都指向同一个实例。将MyClassInstance设置为null仅影响该引用。它不会影响对象本身,也不会影响任何其他引用。

答案 2 :(得分:2)

因为您要将null分配给变量MyClassInstance,该变量只是引用位于堆上的实际实例。您不以任何方式触摸您的实际类实例。

实际上,你不能直接释放你的类实例占用的内存;这就是垃圾收集器的用途。看看是否有任何引用(想想指针,但没有)到你的实例左边,如果没有,则从内存中删除/收集对象。

也许这会让它更清晰:http://en.csharp-online.net/Value_vs_Reference

答案 3 :(得分:2)

引用类型实例的变量主要是指向内存地址的指针 - 因此您的示例与

相当
int MyClassInstance = 0x1234; // points to a memory containing *your* values
int i = MyClassInstance;
MyClassInstance = 0x0;
if (i !=0x0){ //still 0x1234, because it's a copy }

或换句话说: 变量是引用,而不是对象本身。所以第二个变量是引用的副本。