http://blog.csdn.net/yidon/archive/2007/10/28/1852072.aspx
http://www.cnblogs.com/leening/articles/1172020.html
属性与变量的区别
属性就是 变量:
例子:
public int Y int i=0; string sUer="";等
{
get { return iY;}
set { iY=value; }
}
属性只能通过初始化类,创建对象后才能使用。 变量则没有这方面要求,
实质
属性没有固定的地址,属性的赋值只是使指针 变量赋值只是变量的地址储存所指的地址值
pb a1=new pb(); a1.X=5; int aX1=5;
pb a2=a1; int aX2=aX1;
a1.X=6; aX1=7;
得出的结果是 a2.X=6; 得出的结果是aX2=5
结论:在属性中(a2=a1)实质是a2指向a1的地址,所以更改a1后a1的地址上的值改变,而a2因为指向的是a1的地址,所以a1的值改变后,a2的值也会改变.
在变量中,(aX2=aX1)中其实只是复制了ax1的地址中的值到自己的地址中。所以即使ax1改变值后,ax2不受影响.
补充:
pb a1=new pb(); a1.X=5;
pb a2=a1;
int b=24; a1.X=b
b=6;
----a2.X=24;
ps:属性X被b赋值,但是b更改后,不影响属性X
以下是属性中最难理解和最容易忘记的内容,
class rectangle
{
.......................
有属性X,Y,W,H等,//在些省略了写属性的过程
方法ARea ---W*H
public static Inflate(rectangle rec,int iw,int ih)
{
rec.X=rec.X-iW; rec.Y=rec.Y-iH;
rec.W=rec.W+2*iw; rec.H=rec.H+2*ih;
}
}
class test
{
main()
rectangle RE=new Rectangle(10,20,100,50);//X,Y,W,H
rectangle R=RE;
-------------R的值为 X=10,Y=20,Area=5000
rectangle.inflate(R,20,20);
-----------R的值为 X=-10,Y=0,W=140,H=90,Area=12600
------------RE的值为X=-10,Y=0,W=140,H=90,Area=12600
}
总结:
为什么R在调用inflate方法后会值改变,因为在调用这个方法时,方法中的变量rec读取了R的地址,当rec改变值时,改变的值储在R的地址上,所以不可避免地改变R。因为R=RE时,R读取了RE的地址。rec更改r的地址值,实质是更改了RE的地址。
如果想不影响R和RE等赋值对象,可以创建副本
public static Inflate(rectangle rec,int iw,int ih)
{
rectangle rect=new rectangle(20,30,60,50)
rec=rect;
rec.X=rec.X-iW; rec.Y=rec.Y-iH;
rec.W=rec.W+2*iw; rec.H=rec.H+2*ih;
}
rectangle RE=new Rectangle(10,20,100,50);//X,Y,W,H
rectangle R=RE;
-------------R的值为 X=10,Y=20,Area=5000
rectangle.inflate(R,20,20);
-----------R的值为 X=10,Y=20,Area=5000
------------RE的值为X=10,Y=20,Area=5000
总结。因为方法Rectangle().虽然rec的值改变了,但是由于rec初始时复制了R的地址,但是之后在方法内,它通过
rec=rect,指针改变了,指在rect的地址上,所以rec只影响了rect的地址值,而不会影响R值。和上面的有本质区别。
void sINE(int ia)
{
ia+=1;
}
int sIND(int ia)
{
ia+=1;
return ia;
}
int a=6;
int b;
b=a;
sINE(a);
b=7;
int c=sIND(a);
-----------a的值为6,c的值是7
b=a,b的值改变后(b=7),但是a的值不会改变,因为变量的赋值,只是复制赋值对象的值,而不是地址。
sINE()方法中ia变量只是复制了赋值对象的值,而不是地址,所以不会影响赋值对象的值。因此sINE(a)后
a的值不会改变。
ps:这一章节,将变量与属性的区别精华和本质写出来了。到时不明白,可以看一下文章中提供的例子和注释