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()我们称之为只写属性

 

posted @ 2019-03-14 19:25  杯子旁边有手机  阅读(325)  评论(0编辑  收藏  举报