先看这段程序:
double[] zz = new double[100];
double[] qq = zz;
按理说数组为引用类型但是
zz = new double[10];
MessageBox.Show(qq.Length.ToString());
qq的长度仍然为100,请问如何让qq自动随着zz的改变而改变?
或者说如何让qq放弃以前的引用,释放资源?
zz = new double[10]; //又在内存中开辟一个空间,让zz指向这个新的内存地址,此时:zz与qq没有关系了 因为指 向 了不同的地址 ,故qq长度不变
MessageBox.Show(qq.Length.ToString());
qq的长度仍然为100,请问如何让qq自动随着zz的改变而改变? //你可以判断一下 while(qq!=zz){qq=zz;} ,
//这样就可以保持qq和zz随时相等了
或者说如何让qq放弃以前的引用,释放资源?
你可以判断一下, while (zz!=qq) 可以让 qq=zz; 这样就能保持zz=qq了
可以用ref的
假如有100个类似qq的对象我要用100个qq=zz吗?
@文楚: 你创建的qq都是对象,如果想让qq==zz,不管多少个,都应该让qq指向zz指向的地址吧,也就是zz=qq,我个人觉得如果有100个对象的话,也应该用100个qq=zz,个人见解
现在qq 就谁存储着zz的引用
double[] zz = new double[100];
double[] qq = zz;
zz[0] = 1;
Console.WriteLine(qq[0]);
如果放弃 等于其他变量或null就可以了
qq = null;
double[] zz = new double[100];
double[] qq = zz;
zz[0] = 1;
qq = null;
Console.WriteLine(zz[0]);
Console.WriteLine(qq[0]);
那请问如何让qq自动随着zz的改变而改变?
@文楚: 现在就是啊
@慧☆星: 我是说即使对zz重新幅值qq也会变
加入有100个类似qq的对象我要用100个qq=null吗?
你上面是创建了两个对象,你只需要创建一个对象,以后直接用这一个对象就可以达到你的目的了。
有时为了封装 可能每次操作都需要new一个对象,但是旧的对象在其他地方仍然有引用,这就导致内存不能及时释放。把旧的引用都去掉因为特别多也不是很现实啊。
qq长度如果不是100的话,才觉得奇怪。
看清问题!!
double[] zz = new double[100]; //new运算符会在heap中分配内存,把首地址赋值给zz
double[] qq = zz; //qq与zz指向同一块内存空间
按理说数组为引用类型但是
zz = new double[10]; //现在使用new,又在heap中分配了快内存,把地址赋值给zz
MessageBox.Show(qq.Length.ToString()); //qq所指向的数组长度是100,而zz指向的数值长度为10
qq的长度仍然为100,请问如何让qq自动随着zz的改变而改变? //除非他们指向同一块内存
或者说如何让qq放弃以前的引用,释放资源?
谢谢 回答,请问如何让qq自动随着zz的改变而改变“除非他们指向同一块内存”我该如何做到?
@文楚:
double[] zz = new double[100]; //new运算符会在heap中分配内存,把首地址赋值给zz
double[] qq = zz; //qq与zz指向同一块内存空间
zz = new double[10]; //现在使用new,又在heap中分配了快内存,把地址赋值给zz
qq=zz;//现在qq与zz就指向同一块内存了
MessageBox.Show(qq.Length.ToString()); //现在的结果就是10了,而非100了
关于资源释放,那是GC做的工作!具体你可以查查资料
我也帮你解决:
int i=1;
int s=i;
i=5;
1.在堆栈中开辟4字节,给i
2.把 值 为1 存储到 i的4字节内存空间内
3.在堆栈中开辟 4字节 给 s
4.把 i 所在内存空间取出值为1,然后复制给 s;
5.i=5;清空i 4字节内存空间中的值1,把值5 存储到 i 空间内
6.s 内存空间 未改变
以上是值类型
Double[] d1=new Doule[100];
Double[] d2=d1;
d1=new Double[10];
1.在堆栈中 开辟4字节 内存 给d1 引用
2.计算new Doule[100];新建对象的内存空间,在堆中分配内存,并且nextObjPtr返回 对象在堆中的地址给d1,存储到d1的4字节空间内。
3.在堆栈中 开辟4字节内存 给d2 引用
4.复制d1内的值,也就是 引用的地址给 d2.
5.d1=new Double[10];在堆内 新开辟一个内存空间,并且返回堆内 地址给d1,d1先清除原先 堆内的引用地址,再存储新的引用地址
6.此刻,d2存储的引用地址未变,所以输出 100.
说的很精准