zoukankan      html  css  js  c++  java
  • 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()我们称之为只写属性

  • 相关阅读:
    PHP 实现下载文件到本地
    PHP 文件上传服务端及客户端配置参数说明
    报错: WARN hdfs.DFSClient: Caught exception java.lang.InterruptedException
    报错: Name node is in safe mode
    转载:CSS的组成,三种样式(内联式,嵌入式,外部式),优先级
    Windows 7 SP1 x64 旗舰版 微软官方安装U盘的制作
    jQuery滑过头像图片展示个人信息效果
    SQL Developer 4.1.3
    [转]内嵌页面iframe以及和其兄弟iframe的相互传值
    Environment variable:"PATH" 状态 失败
  • 原文地址:https://www.cnblogs.com/ImOrange/p/10532874.html
Copyright © 2011-2022 走看看