C#-属性
属性(properties)
属性本质上就是两个方法,一个get(),一个set();
public class Person { public string _name; public string Name { //当输出属性的值的时候,会执行get方法 get { return _name; }//当给属性赋值的时候,会执行set方法 set { _name = value; } } public int _age; public int Age { get {return _age; } set {_age = value; } } public char _gender; public char Gender { get {return _gender; } set {_gender =value; } } public void CHLSS() { Console.WriteLine($"我叫{this.Name},今年{this._age}岁,性别{this._gender}"); } }
static void Main(string[] args) { //创建Person类的对象,这个过程叫做类的实例化 Person suQuan = new Person(); suQuan._name = "SQ"; suQuan._age = -22; suQuan._gender = '春'; suQuan.CHLSS(); Console.ReadKey(); }
使用Reflector7.0软件,反编译代码生成的可执行文件XX.exe,查看set()与get()的方法:
由此可以看出,属性本身不存储数值,属性类似于“中间加工商”,经过一个中间变量value,最终数值的输入输出都存放在字段“_name”里面。
于是我们可以通过控制变量value,对字段的赋值和取值进行限定;得出属性的作用就是保护字段。
如果用女人来形容字段,那么男人就是属性:所有与外界接触的动作都只由男人(属性)来完成,女人(字段)就应该好好保护起来。
所以声明字段时的public访问修饰符应该删除(不加访问修饰符默认为private)或者改成private,字段私有化之后,Main方法中就会报错,无法直接对字段进行赋值,这时我们就可以通过属性给字段赋值,由于数据的重要性,外界不能访问到,字段必须是私有的。代码如下:
public class Person { public string _name; public string Name { //当输出属性的值的时候,会执行get方法 get { return _name; }//当给属性赋值的时候,会执行set方法 set { _name = value; } } public int _age; public int Age { get {return _age; } set {_age = value; } } public char _gender; public char Gender { get {return _gender; } set {_gender =value; } } public void CHLSS() { Console.WriteLine($"我叫{this.Name},今年{this._age}岁,性别{this._gender}"); } }
static void Main(string[] args) { //创建Person类的对象,这个过程叫做类的实例化 Person suQuan = new Person(); suQuan.Name = "SQ"; suQuan.Age = -22; suQuan.Gender = '春'; suQuan.CHLSS(); Console.ReadKey(); }
但是,赋值的时候还有问题,代码中给年龄Age的方法赋值“-22”,给性别Gender的方法赋值为“春”,这样操作不合逻辑的,年龄不可能为负数,性别不可能是输入的任意一个字符比如“春”。为了防止这些违法操作的发生,我们需要在属性里面对赋值的值进行限定,代码如下:
public class Person { string _name; public string Name { //当输出属性的值的时候,会执行get方法 get { return _name; } //当给属性赋值的时候,会执行set方法 set { _name = value; } } int _age; public int Age { get {return _age; } set { if (value < 0 || value > 100) { value = 0;//小于0或大于100,默认返回0 } _age = value; } } char _gender; public char Gender { get { if (_gender != '男' && _gender != '女') { return _gender = '男';//不为男女默认返回男 } return _gender; } set {_gender =value; } } public void CHLSS() { Console.WriteLine($"我叫{this.Name},今年{this.Age}岁,性别{this.Gender}"); }
static void Main(string[] args) { //创建Person类的对象,这个过程叫做类的实例化 Person suQuan = new Person(); suQuan.Name = "SQ"; suQuan.Age = -22; suQuan.Gender = '春'; suQuan.CHLSS(); Console.ReadKey(); }
打印结果如下:
两种限定方式:
1)对取值进行限定,就在get()里面进行设定,如Gender属性中的限定方式;此方式是对字段进行判断。
2)对赋值进行限定,就在set()里面进行设定,如Age属性中的限定方式;此方式是对value进行判断。
并不是所有属性都具有set()和get(),
既有get()也有set()我们称之为可读可写属性
只有get()没有set()我们称之为只读属性
没有get()只有set()我们称之为只写属性