C# 属性访问器
属性的访问器包含与获取或设置属性有关的可执行语句。访问器声明可以包含 get 访问器或 set 访问器,或者两者均包含。声明采用下列形式之一:
get{}set{}
get 访问器:
get 访问器体与方法体相似。它必须返回属性类型的值。执行 get 访问器相当于读取字段的值。
以下是返回私有字段 name 的值的 get 访问器:
privatestringname;//thenamefieldpublicstringName//theNameproperty{get{returnname;}}
当引用属性时,除非该属性为赋值目标,否则将调用 get 访问器读取该属性的值。
例如:
Employeee1=newEmployee(); ... Console.Write(e1.Name);//Thegetaccessorisinvokedhere
get 访问器必须在 return 或 throw 语句中终止,并且控制不能超出访问器体。
set 访问器:
set 访问器与返回 void 的方法类似。它使用称为 value 的隐式参数,此参数的类型是属性的类型。
在下例中,set 访问器被添加到 Name 属性:
publicstringName{get{returnname;}set{name=value;}}
当对属性赋值时,该操作将调用 set 访问器。
例如:
e1.Name="Joe";//Thesetaccessorisinvokedhere
在 set 访问器中对局部变量声明使用隐式参数名 (value) 是错误的。
备注:
属性按如下方式,根据所使用的访问器进行分类:
只带有 get 访问器的属性称为只读属性。无法对只读属性赋值。
只带有 set 访问器的属性称为只写属性。只写属性除作为赋值的目标外,无法对其进行引用。
同时带有 get 和 set 访问器的属性为读写属性。
在属性声明中,get 和 set 访问器都必须在属性体的内部声明。
使用 get 访问器更改对象的状态是一种错误的编程样式。
我们通过下面的例子来认识什么是访问器:
usingSystem;namespaceAccessorEG{publicclassStudent{//私有字段privatefieldprivateint_age;//公开的属性publicpropertypublicintAge{get{return_age;}set{_age=value;}}}classProgram{staticvoidMain(string[]args){Studentstu=newStudent();stu.Age=10;//使用了修改Console.WriteLine(stu.Age.ToString());//使用了读取输出10Console.ReadKey();}}}
很好理解,访问器就是指对象类型成员对外界的接口,就是使对象类型成员与外界进行信息交互的桥梁,有了访问器,外界就能对对象成员进行读、写的对应操作。
那么,什么成员能够拥有访问器呢?非只读的字段和事件是可以声明访问器的。当然,只读域也能提供被外界获取的接口,即get,但是只能在声明或构造函数中初始化,而且它并不支持提供set方法。
usingSystem;namespaceAccessorEG{publicclassStudent{//私有字段privatefieldprivatereadonlyint_age=10;//公开的属性publicpropertypublicintAge{get{return_age;}}}classProgram{staticvoidMain(string[]args){Studentstu=newStudent();Console.WriteLine(stu.Age.ToString());//使用了读取输出10Console.ReadKey();}}}
上述代码中只读域的值在声明时就已经赋了,而它对应公开属性的访问器中也不能提供set方法,不然会无法通过编译,但是它可以被外界取得。
关于字段的访问器我们还要说一些,常见的有以下写法:
usingSystem;namespaceAccessorEG{publicclassStudent{#region全访问权限//私有字段privateint_age;//与_age对应的公开属性,包含了set和get方法publicintAge{get{return_age;}set{_age=value;}}//如果您安装了.NET3.0,那么您可以使用自动属性,届时,上面的代码即可以下面的代替 //在VS.NET下输入prop连击两下Tab键,编译器会自动帮您生成自动属性 //publicintAge{get;set;}#endregion//全访问权限#region只读属性privatestring_name;publicstringName{get{return_name;}}//等同于 //publicstringName{privateset;get;}#endregion#region只写属性privatebool_sex;publicboolSex{set{_sex=value;}}//等同于 //publicboolSex{set;privateget;}#endregion}classProgram{staticvoidMain(string[]args){Studentstu=newStudent();stu.Age=18;//stu.Name="Johness";异常,编译错误,因为该属性只读 //Console.WriteLine(stu.Sex.ToString());异常,编译错误,因为该属性只写Console.WriteLine(stu.Age.ToString());//使用了读取Console.ReadKey();//输出18}}}
以上示例中的只读、只写仅对外界有效,如果您显示得制定了该访问器的所有者,即类的私有字段。那么在类的内部,您仍可以方便的使用您定义的私有字段进行读写操作,因此,我建议朋友们定义字段及其访问器使用.NET2.0的语法而不用3.0的新语法(自动属性)。当然,利用访问器也能更好地对数据有效性进行验证:
usingSystem;namespaceAccessorEG{publicclassStudent{//私有字段privateint_age;//与_age对应的公开属性,包含了set和get方法publicintAge{get{return_age;}//利用访问器对输入的年龄进行验证 //如果输入值小于0或者大于100 //可以赋为默认值18或者不进行操作set{if(value>=0&&value<=100)_age=value;//如果数据无效不进行操作可以注释以下内容else_age=18;}}}classProgram{staticvoidMain(string[]args){Studentstu=newStudent();stu.Age=-2;//赋无效值Console.WriteLine(stu.Age.ToString());Console.ReadKey();//输出18}}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。