一个类中需要有描述这个类信息的数据,而存储这些数据的变量就成为字段。
字段默认的访问级别为private(只有本类可以直接访问),我们将其访问级别改为public,在其他类中就可以访问了。
字段和属性表示对象包含的信息,字段类似于变量,因为可以直接读取或设置他们。
属性是对字段的封装。属性可以对字段的访问进行控制,可以进行非法设置值的判断。属性并不存储数据,字段存储数据。
封装后,有一些字段我只能赋值,不能读取,有些只能读取,不能赋值,而且可以对传过来的值进行选择。
建议所有的字段不要写成public级别,为字段设置属性,符合面向对象封装的原则。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 属性
{
class Program
{
static void Main(string[] args)
{
}
}
class Person
{
//string _name; //字段 姓名 字段的默认访问级别为 private(只能在本类中调用)
//public string Name //属性 对字段_name进行封装
//{
// get
// {
// return _name;
// }
// set
// {
// _name = value;
// }
//}
public string Name //这是自动实现的属性 方便快捷生成属性 相当于以上注释的代码
{
get; //当写自动实现的属性时,get和set两个都不能省
set;
}
private int _age; //字段 年龄
public int Age //属性
{
get { return _age; }
set
{
if (value < 0) //年龄是大于0的
{
_age = 18; //如果用户使用非法值,将年龄默认设置为18岁
}
else
{
_age = value;
}
}
}
public char Gender; //字段 性别 访问级别为public 在其他类中可以直接访问
private DateTime birthdate;
//字段 生日 该字段的访问级别为private,我要想在其他类中使用该字段,只好使用方法
public DateTime GetBirthdate() //这里的方法相当于属性中的get
{
return birthdate;
}
public void SetBirthdate(DateTime value) //这里的方法相当于属性中的set
{
birthdate = value;
}
//所谓属性就是绑定了字段的两个方法
//当我们在属性中不写 get访问体时,该字段就是只写,不写set访问体时,该字段就是只读。
}
}
惯用法:属性开头字母大写,字段开头字母小写。
选中字段 不论是public int age; 或者是private int age; 都可以。选中后按快捷键 ctrl+r,e 弹出封装字段窗口,改改属性名称即可。
或是选中字段后,鼠标右键选择重构,选择封装字段,改改属性名称即可。
.net3.0之后就有了属性的简写方式
public string Name { get; set; }
//编译器自动帮我们生成私有字段和set get代码段
//自动实现的属性,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;}
当属性是派生属性或者要做访问控制或需要控制非法值的时候,就不能如此使用了。这个时候需要自己实现访问器:
private int _salary;
public int Salary
{
get
{
//工资不可以随便给别人看,得有权限
if(Authorization.Check(visitor))
return _salary;
throw new NotAuthorizeException();
}
set
{
//工资是大于零的
if(value > 0)
{
_salary = value;
}
else
{
//提示错误
}
}
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。