首页 新闻 会员 周边 捐助

一个关于c#引用类型的问题 很简单

0
悬赏园豆:10 [已解决问题] 解决于 2012-02-16 23:59

先看这段程序:

double[] zz = new double[100];
double[] qq = zz;

按理说数组为引用类型但是

zz = new double[10];

MessageBox.Show(qq.Length.ToString());

qq的长度仍然为100,请问如何让qq自动随着zz的改变而改变?

或者说如何让qq放弃以前的引用,释放资源?

为森的主页 为森 | 小虾三级 | 园豆:579
提问于:2012-02-04 03:22
< >
分享
最佳答案
0
double[] zz = new double[100];  //在内存中开辟空间 ,让zz指向他
double[] qq = zz;               //又创建一个地址qq,让qq也指向他  此时qq zz都指向同一个地址 

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了

 
收获园豆:10
FuSheng2012 | 菜鸟二级 |园豆:209 | 2012-02-11 10:12

可以用ref的

为森 | 园豆:579 (小虾三级) | 2012-02-14 00:12

假如有100个类似qq的对象我要用100个qq=zz吗?

为森 | 园豆:579 (小虾三级) | 2012-02-14 00:16

@文楚: 你创建的qq都是对象,如果想让qq==zz,不管多少个,都应该让qq指向zz指向的地址吧,也就是zz=qq,我个人觉得如果有100个对象的话,也应该用100个qq=zz,个人见解

FuSheng2012 | 园豆:209 (菜鸟二级) | 2012-02-14 08:00
其他回答(5)
1

现在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]);

慧☆星 | 园豆:5722 (大侠五级) | 2012-02-04 09:56

那请问如何让qq自动随着zz的改变而改变?

支持(0) 反对(0) 为森 | 园豆:579 (小虾三级) | 2012-02-04 20:24

@文楚: 现在就是啊

支持(0) 反对(0) 慧☆星 | 园豆:5722 (大侠五级) | 2012-02-06 14:04

@慧☆星: 我是说即使对zz重新幅值qq也会变

支持(0) 反对(0) 为森 | 园豆:579 (小虾三级) | 2012-02-07 05:56

加入有100个类似qq的对象我要用100个qq=null吗?

支持(0) 反对(0) 为森 | 园豆:579 (小虾三级) | 2012-02-14 00:16
0

你上面是创建了两个对象,你只需要创建一个对象,以后直接用这一个对象就可以达到你的目的了。

悟行 | 园豆:12559 (专家六级) | 2012-02-04 23:43

有时为了封装 可能每次操作都需要new一个对象,但是旧的对象在其他地方仍然有引用,这就导致内存不能及时释放。把旧的引用都去掉因为特别多也不是很现实啊。

支持(0) 反对(0) 为森 | 园豆:579 (小虾三级) | 2012-02-05 02:18
0

qq长度如果不是100的话,才觉得奇怪。

chenping2008 | 园豆:9836 (大侠五级) | 2012-02-05 13:46

看清问题!!

支持(0) 反对(0) 为森 | 园豆:579 (小虾三级) | 2012-02-06 00:16
2

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放弃以前的引用,释放资源?          

MR_xiaodan | 园豆:142 (初学一级) | 2012-02-05 16:10

谢谢 回答,请问如何让qq自动随着zz的改变而改变“除非他们指向同一块内存”我该如何做到?

支持(0) 反对(0) 为森 | 园豆:579 (小虾三级) | 2012-02-06 00:16

@文楚: 

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做的工作!具体你可以查查资料

支持(0) 反对(0) MR_xiaodan | 园豆:142 (初学一级) | 2012-02-06 08:37
1

我也帮你解决:

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.

 

 

Anleb | 园豆:208 (菜鸟二级) | 2012-02-09 17:05

说的很精准

支持(0) 反对(0) 为森 | 园豆:579 (小虾三级) | 2012-02-14 00:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册