.NET中公共变量与属性的区别(get/set)[转]

 .NET中公共变量与属性的区别

http://blog.csdn.net/yidon/archive/2007/10/28/1852072.aspx

 

关于get和set访问器以及属性和字段变量的区别问题 

 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=6

结论:在属性中(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的值不会改变。

阅读更多
文章标签: .net class c
个人分类: winform
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭