快乐每一天~~~

C#的属性访问器。。。

上一篇 / 下一篇  2008-05-18 19:31:33 / 个人分类:编程

查看( 4 ) / 评论( 5 )
属性的访问器包含与获取(读取或计算)或设置(写)属性有关的可执行语句。访问器声明可以包含   get   访问器或   set   访问器,或者两者均包含。声明采用下列形式之一:   爱好者博墅n:nAsQa:n
  set   {accessor-body}   爱好者博墅B r"qk9Dr
  get   {accessor-body}   爱好者博墅A |o0B5ON-NN
  其中:     爱好者博墅ZE*z Vv(\:FR+O
  accessor-body     
YwS!R$@Bm v)`0  包含将在调用访问器时执行的语句的块。     爱好者博墅h:v4R5G\CR~4Q
  爱好者博墅9B8K,d2@+K}"HD8d
1>get   访问器   
#b#GS'Um0  get   访问器体与方法体相似。它必须返回属性类型的值。执行   get   访问器相当于读取字段的值。以下是返回私有字段   name   的值的   get   访问器:   爱好者博墅 u3a Ue W2s.c2i
  private   string   name;       //   the   name   field   
k0PL"w,YY(m aE0  public   string   Name       //   the   Name   property   爱好者博墅d#OZ3dUtj
  {   
^qz hH:gC\%G `0        get     
gUb-`$] X(a lB0        {   爱好者博墅5f;q#B0AF$o,Se]Y5E
              return   name;     
8Au'Vj` u @%[0        }   
,ImH*]~#a7wlgu0  }   
J9_2A Z6eg}PO0  当引用属性时,除非该属性为赋值目标,否则将调用   get   访问器读取该属性的值。例如:   爱好者博墅:uV2n ~$s }
  Employee   e1   =   new   Employee();   爱好者博墅5IX+s gwE
  ...   爱好者博墅cfe7i\X
  Console.Write(e1.Name);       //   The   get   accessor   is   invoked   here   爱好者博墅 C,@jN'v$dfZ ?
  get   访问器必须在   return   或   throw   语句中终止,并且控制不能超出访问器体。   
$V L'd&mh;a\0  
Wcob3w3I5MK!v02>set   访问器   爱好者博墅)uQ Y&LJ"|fwI!r X]
  set   访问器与返回   void   的方法类似。它使用称为   value   的隐式参数,此参数的类型是属性的类型。在下例中,set   访问器被添加到   Name   属性:   
lx{.Uw`'tE0  public   string   Name     
.Vw.f:QL}E0  {   
#JZ5I+Y/] iy ["|0        get     
Vao7snHj~0        {     
1[M(AV\+X,f5U0              return   name;     爱好者博墅GWamK][
        }   爱好者博墅.L.fqNfm+VH
        set     
dv^h9E-UAQ0        {   
oP#h%r2j2}3Z6Ga0              name   =   value;     
4h;IZI\a%~0        }   
`5a ~7jx}!r"C*F$u0  }   
v}1W,[/E.X0  当对属性赋值时,用提供新值的参数调用   set   访问器。例如:   
tbolm^ q@0  e1.Name   =   "Joe";       //   The   set   accessor   is   invoked   here   爱好者博墅^+DG0ScM9o+u
  在   set   访问器中对局部变量声明使用隐式参数名   (value)   是错误的。   爱好者博墅 ?\2|5T ~i
备注:   
L1Q0kyg0  属性按如下方式,根据所使用的访问器进行分类:     
i:X7{g0i\6Qg:Tp[0  只带有   get   访问器的属性称为只读属性。无法对只读属性赋值。     爱好者博墅:lNbLNS.W
  只带有   set   访问器的属性称为只写属性。只写属性除作为赋值的目标外,无法对其进行引用。     爱好者博墅Q9oLm:k W2a
  同时带有   get   和   set   访问器的属性为读写属性。     爱好者博墅&bo7c)@x H$Z/PP_
  在属性声明中,get   和   set   访问器都必须在属性体的内部声明。   
J']fm,};j&P s7q{&S0  使用   get   访问器更改对象的状态是一种错误的编程样式。例如,以下访问器在每次访问   number   字段时都产生更改对象状态的副作用。   爱好者博墅J u,^'_p
  public   int   Number     爱好者博墅.N-Ne*p J8S8[
  {   爱好者博墅5p|_x"j&m'R@9x
        get   爱好者博墅a*TK li9aOt+r^:?
        {   爱好者博墅@g*FMHtAJ]
              return   number++;       //   Don't   do   this   爱好者博墅6XP|,u\/PM|k%X
        }   爱好者博墅*c&{1b:psxLH
  }   爱好者博墅@|"lA.f } y
  可以将   get   访问器用于返回字段值,或用于计算字段值并将其返回。例如:   爱好者博墅\I4bt+|An!wO
  public   string   Name     
"d'\~ ?j0m(_0  {   
0L Xe gRc;Y:Xa0        get     爱好者博墅r4p J{p:A
        {   
Gp|)tb W5I0              return   name   !=   null   ?   name   :   "NA";   
vIO9P d6F0        }   
V?#k X.q"f ?e0  }   
.ZP+ZQP0  在上述代码段中,如果不对   Name   属性赋值,它将返回值   NA。   爱好者博墅4b;i\ex jF
  爱好者博墅V)m\MJ Q.J
示例   1   爱好者博墅YCs)[V:s/b
  此例说明如何访问基类中被派生类中具有同一名称的另一个属性隐藏的属性。   
-cq,ap"kK9_"L0  //   property_hiding.cs   
B9r6zUTpi0  //   Property   hiding   
(|(^N8C`'X?;tV ~J0  using   System;   爱好者博墅H O@B:Z.i#Y L;Z
  public   class   BaseClass     
r!\I5Jc0  {   爱好者博墅d6Q2wx |
        private   string   name;   
B _2g"zi[U0        public   string   Name   
c{.| x-]"P0        {   
NYF"W"g9}"hs0              get     爱好者博墅 x4R%Do P'ol/n#H
              {   爱好者博墅 p5z^1|6I C;G
                    return   name;     
VFi}d T8Y#G8ZS0              }   
DH|:HW-p&[w-^Ko0              set     
tt0bo8cx0              {   爱好者博墅*L:J@4Y2S4ozx$R
                    name   =   value;     
x mRSZ0              }   爱好者博墅R#F:^ ^7Jy
        }   
9@KP3Y(|.t9l~v_4P@0  }   
T |'UT?Y0    爱好者博墅#[#Ek&a;Dm9]
  public   class   DerivedClass   :   BaseClass     
j"kXiJ0  {   爱好者博墅6G)SB+{`Wc
        private   string   name;   
!@1y/cgi Y]1`5N0        public   new   string   Name       //   Notice   the   use   of   the   new   modifier   
uK@rI-ud0        {   
'Mk:n(P.V7I-O^0              get     爱好者博墅 hJUXj
              {   
HIz}k@Q0                    return   name;     
-e Oq5xF&Sc0              }   爱好者博墅'ge0A?O o
              set     爱好者博墅#A5x:h$m6~:a b6p"d2b9a
              {   
o,XH!T]0                    name   =   value;     
w4X fP+zq3w} a s$B9S0              }   
#rw(kJ0qPqZz0        }   爱好者博墅;f`4lW-{7[
  }   爱好者博墅"lG\Y:w+w)\
    爱好者博墅 eH8~8|L0v0IX
  public   class   MainClass     
3[4~` X%}m*}Y0  {   爱好者博墅:fN4U'IN0f
        public   static   void   Main()     
0Ln#RR$c m0        {   爱好者博墅1oan ~$yqB1N
              DerivedClass   d1   =   new   DerivedClass();   爱好者博墅"I6N!yrs
              d1.Name   =   "John";     //   Derived   class   property   
F:k.Z f}e b0              Console.WriteLine("Name   in   the   derived   class   is:   {0}",d1.Name);   
}#LrT/m}LXBK0              ((BaseClass)d1).Name   =   "Mary";   //   Base   class   property   爱好者博墅 a D'f0Te;zN6XZ
              Console.WriteLine("Name   in   the   base   class   is:   {0}",   
Jb9S @ X#@0                    ((BaseClass)d1).Name);         
D yJaLF}0        }   爱好者博墅;w[#a1HH,zO;@S
  }   爱好者博墅e?r vd(qJJ!y
  输出   
;S fv`b6c!W r%s|H0  Name   in   the   derived   class   is:   John   爱好者博墅S-L@{pQ0~U'i Z
  Name   in   the   base   class   is:   Mary   
M#Y%fJ%Wc9H"di0  以下是上例中显示的重点:     
K.f+b-n T0  派生类中的属性   Name   隐藏基类中的属性   Name。在这种情况下,派生类的该属性声明使用   new   修饰符:     爱好者博墅I/T ZN F
        public   new   string   Name     
yO(A'P'YlF`0        {   爱好者博墅'\&E5Yv}
        ...   爱好者博墅a0xu.YyM~E8E0C
  转换   (BaseClass)   用于访问基类中的隐藏属性:     爱好者博墅 L9m h ys7`7v
        ((BaseClass)d1).Name   =   "Mary";   
^&O6p@ xRV0  有关隐藏成员的更多信息,请参见   new   修饰符。   
)niSjIsE&V0  
-o,V&w~"z'No0示例   2   爱好者博墅6O\6T1V&tkM&B#c
  在此例中,Cube   和   Square   这两个类实现抽象类   Shape,并重写它的抽象   Area   属性。注意属性上   override   修饰符的使用。程序接受输入的边长并计算正方形和立方体的面积。它还接受输入的面积并计算正方形和立方体的相应边长。   
N.@M'~ Pv0Zu&j0  //   overridding_properties.cs   
gEBS$k0  //   Overriding   properties   
q4J0T.G+[ ys.v(k%A0  using   System;   爱好者博墅p0i\8W9?T}~sZt
  abstract   class   Shape     爱好者博墅:~)CxH,S
  {   
gM(a:T*n0        public   abstract   double   Area     爱好者博墅5}r(X.m7K
        {   爱好者博墅9r9C9F3g*vUBNd
              get;   
&Q"EM5n h0              set;   爱好者博墅7Z L3f'| q;c)D&b
        }   爱好者博墅#F)Aq_W u
  }   爱好者博墅o^3?n AO's
   
zszB(n v0  class   Square:   Shape     
v#x,M5a9u0  {   
2n4AT:}$m-zX0              public   double   side;   
~W?4bl+lgL3a L0    爱好者博墅^x u5v6eC"`.HI
              //   Constructor:   
?$Z,h3sC,^^s0              public   Square(double   s)     
5HdN&E!Ex3PYR9j0              {   爱好者博墅/B.}Z#apGN#{5MH1|
                    side   =   s;   爱好者博墅Sul,mSe6J0X
              }   
^ Do'o)~0   
yw"CHR&hpB _b0        //   The   Area   property   
:b+K0Tz v$C b'f0        public   override   double   Area     
-m&lKK6\9B,@T0        {   爱好者博墅6K e(pp9?.zW%Y3Z#s
              get     
qziI%p*{!AC0              {   爱好者博墅}2@4WN5tg"A
                    return   side*side   ;     爱好者博墅 \C-J[$m1zpk}
              }   爱好者博墅^]&v t(lx
              set     
^]tBM^ x0              {   
z G5H~+Vp}0                    //   Given   the   area,   compute   the   side   
pRk~"?)w0                    side   =   Math.Sqrt(value);     爱好者博墅)e5loaA7V/Ti1f
              }   
6e*i/AF$z"F8b,T0        }   
:g.lE.E1l-lMk3b0  }   爱好者博墅$P p w.Og&d
   
4s#yeRg1{Yt;S0  class   Cube:   Shape     爱好者博墅&vW9Hbw@lx
  {   爱好者博墅g7U.@&h&nh
              public   double   side;           
vbQ8Q8q4gzq9y,`0    爱好者博墅m7typDMe`{)k
              //   Constructor:   
?1stF n%@~H0              public   Cube(double   s)     爱好者博墅 uR*f/q [#U? `ZO
              {   
pq4iN1G[0                    side   =   s;   
![ e3z?L0              }   
C7^C9a(vp.jJ0    爱好者博墅:\5Te0Q.d0F&Z%I,ZH
              //   The   Area   property   
E'a:} qh(t@9u%s0              public   override   double   Area     爱好者博墅wK~0r!M ]3h)[
              {   
u:L5h,xS%a.Z1q0bj+CT0                    get     
t a8jT;l.R|_0                    {   
3a1]ZiS.@d;[0                          return   6*side*side;   
|h,K#T1xk/[0                    }   爱好者博墅h v0B/@6t5K9|
                    set     爱好者博墅m5M7IPn2f)EF6j6??
                    {   爱好者博墅mH;nk(_We
                          //   Given   the   area,   compute   the   side   
tW4|/u VI'E$R)Sm"l0                          side   =   Math.Sqrt(value/6);   爱好者博墅3?A J#J`$m^6f
                    }   爱好者博墅['I ve&` Q ?PqJS
              }   
| BL4wVge}c0  }   爱好者博墅"_VoJ ~\3h#w
    爱好者博墅 [I0n9n2R
  public   class   MainClass     爱好者博墅 \"~8|#V l/i#e
  {   
#Q2G3{/?'Bg,A4gHm!ZI0        public   static   void   Main()       爱好者博墅6Z;I-x+rkiEB3L
        {   爱好者博墅2_ Z} o8FXoR6~\
              //   Input   the   side:   
2N0XP+}T*F0              Console.Write("Enter   the   side:   ");   爱好者博墅vD$Q0gIr?\|wi
              string   sideString   =   Console.ReadLine();         
?R^\:H0              double   side   =   double.Parse(sideString);   爱好者博墅V6U m CP3F*Y]
    爱好者博墅9G1b^ p {#f
              //   Compute   areas:   爱好者博墅,D6DHy"K6w Y*{
              Square   s   =   new   Square(side);   
+CQl,EN.c0              Cube   c   =   new   Cube(side);   爱好者博墅oI p0a Ip.U1M
    爱好者博墅hVp!W:f'YRZi
              //   Display   results:   
9Aa&A9MlIyFIE@0              Console.WriteLine("Area   of   a   square   =   {0:F2}",s.Area);   
B$}&o1^)VU#^0              Console.WriteLine("Area   of   a   cube   =   {0:F2}",   c.Area);     
3H1zu/k~ q0    爱好者博墅3U.|#{[u\
              //   Input   the   area:   爱好者博墅4|8n*}$V:Y_
              Console.Write("Enter   the   area:   ");   
U_s5B#k5b;s~#{oX/I0              string   areaString   =   Console.ReadLine();         
fa |v ~-?OC0              double   area   =   double.Parse(areaString);   
?;`4s4COv|0   
6bMzkzq*V[0              //   Compute   sides:   爱好者博墅Uwm.?a C!ZSE
              s.Area   =   area;   
u|J*X*?4~7lE0              c.Area   =   area;   爱好者博墅*t#UWP`M7E$g
   
!rQ(WWh;a-S)C o0              //   Display   results:   爱好者博墅Cv G,u|
              Console.WriteLine("Side   of   a   square   =   {0:F2}",   s.side);   爱好者博墅}J*L7s Nz km9vu)@"d
              Console.WriteLine("Side   of   a   cube   =   {0:F2}",   c.side);   爱好者博墅v[(Owc;A:n-B
        }   
9s5FulWZckrF L!N0  }   爱好者博墅P&a Np)b l
  输入   
;H;nF bS0Tg&LC3I0  4   
CbK4w'n2t!lb#x.U0  24   爱好者博墅._^+z$\,T&^0q%i
  示例输出   爱好者博墅e l4W t8d
  Enter   the   side:   4   爱好者博墅,Ygk i PE9T
  Area   of   a   square   =   16.00   
9U_fQ q&w*}0  Area   of   a   cube   =   96.00   
)O&V3JWW{#p bQe0  Enter   the   area:   24   
9}i(sWke9[R+nuk8`0  Side   of   a   square   =   4.90   爱好者博墅1P-P0O/]mh'Y8]6b2?
  Side   of   a   cube   =   2.00
zz/B#v#^0爱好者博墅@Y+_$`mH5I|6R
和广大初学者分享一下。。。

TAG:

隐龍阁 潜龙 发布于2008-05-18 19:18:34
目前看不懂,我也懒得看,捡个沙发闪人算了。
秋雨笑春风 xushine 发布于2008-05-18 19:20:02
好长的CODE
gc319的世界 gc319 发布于2008-05-18 19:23:28
回复 3楼 的帖子
就举了两个例子而已嘛。。。。
4XY yDqz3G*|
]电脑爱好者|电脑爱好者论坛|电脑爱好者网站|软件使用|软件技巧|数码使用|数码技巧|硬件使用|硬件技巧

9P*X6wO#VMJe{[ 本帖最后由 gc319 于 2008-5-18 19:26 编辑 ]
熊窝 Icybear 发布于2008-05-18 20:06:35
C#就是麻烦,搞这么多乱七八糟的功能……不就是getter/setter么
.c2N?vm?H爱好者博墅越发BS M$了
Liangent's Liangent 发布于2008-05-19 14:13:16
增加语言复杂度~
我来说两句

(可选)

日历

« 2008-07-23  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 1675
  • 日志数: 37
  • 图片数: 4
  • 建立时间: 2007-06-26
  • 更新时间: 2008-07-08

RSS订阅

Open Toolbar