首页 新闻 会员 周边 捐助

引用类型也值类型的疑问

0
悬赏园豆:20 [已解决问题] 解决于 2010-03-03 09:22

众所周知:值类型在栈中,而应用类型在堆中。但是呢,一个类是引用类型吧,他有一个int型的字段或属性成员,那这个成员也该是放在了堆中吧(实际上我看到的资料里面都是这样说的)。由此这个成员可以引用吧。但是呢,看下面的代码:

 

代码
protected void Page_Load(object sender, EventArgs e)
{
a aa
= new a();
b bb
= new b();
aa.a1
= 11;
bb.b1
= aa.a1;
bb.b1
= 22;
Response.Write(aa.a1.ToString()
+"<br/>"+bb.b1.ToString());
}
}
public class a
{
public int a1
{
get; set; }
}
public class b
{
public int b1
{
get; set; }
}

 

但是结果是:11 22

改成字段效果也是相同的。这就不理解了~~~

问题:

1.也就是:bb.b1 = aa.a1; 不是对其的引用?

2.类成员(值类型成员)到底是在栈还是堆?如果是堆的话不应该出现上面情况吧?

~~~基础没有学好啊,请教啦~~

 

LittlePeng的主页 LittlePeng | 老鸟四级 | 园豆:3445
提问于:2010-03-02 21:04
< >
分享
最佳答案
0

1 是对其的引用

2 类成员是在堆上的,但仍然是值类型。

因为你的b是new出来的b,是单独的一个内存空间,而不是对a的引用,所以对b1的赋值不会影响到a1

收获园豆:20
查尔斯 | 老鸟四级 |园豆:3832 | 2010-03-02 21:57
其他回答(4)
0

你这是进行值得赋值操作,不是对相互之间的地址引用。

西越泽 | 园豆:10775 (专家六级) | 2010-03-02 22:07
是引用的
支持(0) 反对(0) LittlePeng | 园豆:3445 (老鸟四级) | 2010-03-03 09:26
0

1.你用new创建了两个不同的对象实例,在内存中表现为不同的内存地址

2.bb.b1 = aa.a1实际上时值类型的复制操作

解释值类型以及引用类型的文章

品味类型---值类型与引用类型(上)-内存有理

品味类型---值类型与引用类型(中)-规则无边

品味类型---值类型与引用类型(下)-应用征途

 

langford | 园豆:710 (小虾三级) | 2010-03-02 23:18
是引用的
支持(0) 反对(0) LittlePeng | 园豆:3445 (老鸟四级) | 2010-03-03 09:26
那文章非常好啊~
支持(0) 反对(0) LittlePeng | 园豆:3445 (老鸟四级) | 2010-03-03 10:06
0

你的这段代码:

a aa = new a(); //托管堆上分配
b bb
= new b(); //托管堆上分配too,因为a和b是class


aa.a1 = 11; //11在栈上分配(因为int是值类型的,即strcut),aa.a1复制其引用
bb.b1
= aa.a1; //bb.b1 复制了上面的引用,指向的还是那个11的地址
bb.b1
= 22; //在栈上新分配了一个22,引用地址赋予了bb.b1

所以结果当然是11 22

_______________________

可以再扩展一下,加上以下代码:

int c1 = aa.a1;

bb.b1 = aa.a1;

aa.a1 = 33;

Response.Write(c1.ToString()+"<br/>"+bb.b1.ToString());

输出是多少?你做对了就基本明白啦~

vons | 园豆:1033 (小虾三级) | 2010-03-03 00:09
是:11 33啊,非常感谢,终于搞懂了,aa,bb是都占用了空间的
支持(0) 反对(0) LittlePeng | 园豆:3445 (老鸟四级) | 2010-03-03 09:22
不好意思结账的时候点错了,不能改了~~
支持(0) 反对(0) LittlePeng | 园豆:3445 (老鸟四级) | 2010-03-03 09:29
0

a aa = new a(); //托管堆上分配
b bb
= new b(); //托管堆上分配too,因为a和b是class


aa.a1 = 11; //11在栈上分配(因为int是值类型的,即strcut),aa.a1复制其引用
bb.b1
= aa.a1; //bb.b1 复制了上面的引用,指向的还是那个11的地址
bb.b1
= 22; //在栈上新分配了一个22,引用地址赋予了bb.b1

风影极光 | 园豆:1573 (小虾三级) | 2010-03-03 08:46
谢谢哈~~
支持(0) 反对(0) LittlePeng | 园豆:3445 (老鸟四级) | 2010-03-03 09:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册