一个类中需要有描述这个类信息的数据,而存储这些数据的变量就成为字段。

字段默认的访问级别为private(只有本类可以直接访问),我们将其访问级别改为public,在其他类中就可以访问了。

字段和属性表示对象包含的信息,字段类似于变量,因为可以直接读取或设置他们。

属性是对字段的封装。属性可以对字段的访问进行控制,可以进行非法设置值的判断。属性并不存储数据,字段存储数据。



封装后,有一些字段我只能赋值,不能读取,有些只能读取,不能赋值,而且可以对传过来的值进行选择。

建议所有的字段不要写成public级别,为字段设置属性,符合面向对象封装的原则。


usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespace属性{classProgram{staticvoidMain(string[]args){}}classPerson{//string_name;//字段姓名字段的默认访问级别为private(只能在本类中调用)//publicstringName//属性对字段_name进行封装//{//get//{//return_name;//}//set//{//_name=value;//}//}publicstringName//这是自动实现的属性方便快捷生成属性相当于以上注释的代码{get;//当写自动实现的属性时,get和set两个都不能省set;}privateint_age;//字段年龄publicintAge//属性{get{return_age;}set{if(value<0)//年龄是大于0的{_age=18;//如果用户使用非法值,将年龄默认设置为18岁}else{_age=value;}}}publiccharGender;//字段性别访问级别为public在其他类中可以直接访问privateDateTimebirthdate;//字段生日该字段的访问级别为private,我要想在其他类中使用该字段,只好使用方法publicDateTimeGetBirthdate()//这里的方法相当于属性中的get{returnbirthdate;}publicvoidSetBirthdate(DateTimevalue)//这里的方法相当于属性中的set{birthdate=value;}//所谓属性就是绑定了字段的两个方法//当我们在属性中不写get访问体时,该字段就是只写,不写set访问体时,该字段就是只读。}}




惯用法:属性开头字母大写,字段开头字母小写。

选中字段 不论是public int age; 或者是private int age; 都可以。选中后按快捷键 ctrl+r,e 弹出封装字段窗口,改改属性名称即可。

或是选中字段后,鼠标右键选择重构,选择封装字段,改改属性名称即可。




.net3.0之后就有了属性的简写方式

public string Name { get; set; }

//编译器自动帮我们生成私有字段和setget代码段

//自动实现的属性,get和set都不能省略

//只读属性public string Name{ get; private set;}

//只写属性public string Name{ private get; set;}

输入prop + 再两下tab键 会出现属性的格式,改改返回值,属性名称就可以了。



按下两下Tab键之后


只需要改改返回值,属性名称就好了。

public string Name { get; set; } //等同于下面的代码


private string name;

public string Name

{

set{ this.name = value;}

get{ return this.name;}

}

自动实现的属性,自动实现了属性的访问器,快速生成属性。

当属性只需要单纯的读写访问时使用。另外,有些特别属性也可以快速实现:

只读属性:publicstring Str{ get; private set;}

只写属性:publicstring Str{ private get; set;}

当属性是派生属性或者要做访问控制或需要控制非法值的时候,就不能如此使用了。这个时候需要自己实现访问器:


privateint_salary;publicintSalary{get{//工资不可以随便给别人看,得有权限if(Authorization.Check(visitor))return_salary;thrownewNotAuthorizeException();}set{//工资是大于零的if(value>0){_salary=value;}else{//提示错误}}}