main()
{
A a = new A();
a.Change();
Console.Write(a.num);
}
class A
{
public int num = 0;
void Change()
{
B.ChangeA(this);
}
}
class B
{
static void ChangeA(A a)
{
a.num = 10;
a = null;
try{
Console.Write(a.num);
catch{ Console.Write("空指针"); }
}
}
运行的结果是:
空指针
10
我想让一个对象自己销毁自己,因为编译器不通过this=null,所以我加了个B类用来改变A对象我想,既然 num=10 了,那说明a的确按引用传过来了,而且后来又报了空指针,说明 a=null 也起作用了,但是为什么退出这个方法之后的Console.Write(a.num)却还能照常运行?
如果是副本,最后打印的num就应该是0,而不是10
{
var a = new MM { xx = "aa" };
var c = a;
Test(ref c);
var b = a;
} private static void Test(ref MM a)
{
a = null;
}这个时候你会发现在Main中调用完Test之后,c已经是null了,但是a仍然指向对象。实际上就算给变量设置null值,也不过是改变了变量值(使得变量不再指向对象),哪里“销毁”了对象了?对象仍然好端端地在内存中,只有GC来收集垃圾的时候才会去销毁它。要使用“指针”来理解变量,画蛇添足编程出错不说,还故弄玄虚。
.net(实际上是10年前的java)利用了一些c++的变量机制的概念是为了让旧的程序员容易理解新的java语言。10年之后把指针概念重新理解,则很累。所以现在干脆把.net的变量跟c++指针划清界限最有效。