众所周知:值类型在栈中,而应用类型在堆中。但是呢,一个类是引用类型吧,他有一个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.类成员(值类型成员)到底是在栈还是堆?如果是堆的话不应该出现上面情况吧?
~~~基础没有学好啊,请教啦~~
1 是对其的引用
2 类成员是在堆上的,但仍然是值类型。
因为你的b是new出来的b,是单独的一个内存空间,而不是对a的引用,所以对b1的赋值不会影响到a1
你这是进行值得赋值操作,不是对相互之间的地址引用。
1.你用new创建了两个不同的对象实例,在内存中表现为不同的内存地址
2.bb.b1 = aa.a1实际上时值类型的复制操作
解释值类型以及引用类型的文章
你的这段代码:
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());
输出是多少?你做对了就基本明白啦~
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