7.成员属性

7.面向对象-封装-成员属性


7.1 知识点

知识回顾

人类

class Person
{
    // 特征——成员变量
    private int age;
    private string name;
    private int money;

    // 行为——成员方法
    public void Speak()
    {
        Console.WriteLine(name);
    }

    // 初始化调用——构造函数
    public Person(int age)
    {
        this.age = age;
    }

    public Person(int age, string name) : this(age)
    {
        this.name = name;
    }

    // 释放时调用——析构函数
    ~Person()
    {
    }
}

成员属性的基本概念

  • 用于保护成员变量。
  • 为成员属性的获取和赋值添加逻辑处理。
  • 解决3P的局限性。

成员属性的基本语法

// 访问修饰符 属性类型 属性名
// {
//     get{}
//     set{}
// }

实例:

class Person
{
    private string name;
    private int age;
    private int money;
    private bool sex;

    public string Name
    {
        get
        {
            // 可以在返回之前添加一些逻辑规则 
            // 意味着这个属性可以获取的内容
            return name;
        }
        set
        {
            // 可以在设置之前添加一些逻辑规则 
            // value 关键字用于表示外部传入的值
            name = value;
        }
    }

    public int Money
    {
        get
        {
            // 解密处理,使要用的值比存储的实际值少5
            return money - 5;
        }
        set
        {
            // 添加逻辑处理 
            if (money < 0)
            {
                money = 0;
                Console.WriteLine("钱不能小于0");
            }

            // 加密处理,使存储的实际值比要用的值多5
            money = value + 5;
        }
    }
}

成员属性中 get 和 set 前可以加访问修饰符

  • 加访问修饰符需要注意:
    • 默认不加会使用属性声明时的访问权限。
    • 加的访问修饰符要低于属性的访问权限。
    • 不能让 get 和 set 的访问权限都低于属性的权限。

实例:

public int Age
{
    // 加了 private 后,外面只能 set 不能 get
    private get
    {
        return age;
    }

    // 不能让 get 和 set 的访问权限都低于属性的权限,会报错
    // private set 报错
    // protected set 报错
    set
    {
        // 添加逻辑处理 
        if (age < 0)
        {
            age = 0;
            Console.WriteLine("年龄不能小于0");
        }
        age = value;
    }
}

get 和 set 可以只有一个

  • 写 get 和 set 时注意:
    • 只有一个时,没必要在前面加访问修饰符。
    • 一般情况下只会出现只有 get 的情况,基本不会出现只有 set。

实例:

public bool Sex
{
    get
    {
        return sex;
    }

    // 自只有 set 不会报错
    // set
    // {
    //     sex = value;
    // }
}

自动属性

  • 作用:外部能得不能改的特征。
  • 如果类中有一个特征是只希望外部能得不能改的,又没什么特殊处理,那么可以直接使用自动属性。
  • 声明时没有对应成员变量的属性,可以理解为自动生成一个成员变量。
public float Height
{
    // 没有在 get 和 set 中写逻辑的需求或者想法
    get;
    private set;
}

成员属性的使用

主函数内:

Person p = new Person();
p.Name = "林文韬";    // 执行的是 set 语句块
Console.WriteLine(p.Name);    // 林文韬,执行的是 get 语句块

p.Money = 1000;
Console.WriteLine(p.Money);    // 1000,但实际存到内存的是1005

p.Age = 22;
// Console.WriteLine(p.Age); // 成员属性 Age 的 get 是私有,不能访问,会报错

Console.WriteLine(p.Sex);    // False,默认值
// p.Sex = true; // 不能修改,没有设置

总结

  • 成员属性概念:一般是用来保护成员变量的。
  • 成员属性的使用和变量一样,外部用对象点出。
  • get 中需要 return 内容;set 中用 value 表示传入的内容
  • get 和 set 语句块中可以加逻辑处理
  • get 和 set 可以加访问修饰符,但是要按照一定的规则进行添加
  • get 和 set 可以只有一个
  • 自动属性是属性语句块中只有 get 和 set,一般用于外部能得不能改这种情况

7.2 知识点代码

using System;

namespace Lesson5_成员属性
{
    #region 知识回顾

    //// 人 类 
    //class Person
    //{
    //    //特征——成员变量
    //    private int age;
    //    private string name;

    //    //金钱
    //    private int money;

    //    //行为——成员方法
    //    public void Speak()
    //    {
    //        Console.WriteLine(name);
    //    }

    //    //初始化调用——构造函数
    //    public Person(int age)
    //    {
    //        this.age = age;
    //    }
    //    public Person(int age, string name) : this(age)
    //    {
    //        this.name = name;
    //    }

    //    //释放时调用——析构函数
    //    ~Person()
    //    {

    //    }
    //}

    #endregion

    #region 知识点一 成员属性的基本概念
    //基本概念
    //1.用于保护成员变量
    //2.为成员属性的获取和赋值添加逻辑处理
    //3.解决3P的局限性
    //  public——内外访问
    //  private——内部访问
    //  protected——内部和子类访问
    //  属性可以让成员变量在外部
    //  只能获取 不能修改  或者  只能修改 不能获取
    #endregion

    #region 知识点二 成员属性的基本语法

    // 基本语法
    // 访问修饰符 属性类型 属性名
    // {
    //     get{}
    //     set{}
    // }

    // 实例
    class Person
    {
        private string name;
        private int age;
        private int money;
        private bool sex;

        //属性的命名一般使用 帕斯卡命名法
        public string Name
        {
            get
            {
                //可以在返回之前添加一些逻辑规则 
                //意味着 这个属性可以获取的内容
                return name;
            }
            set
            {
                //可以在设置之前添加一些逻辑规则 
                // value 关键字 用于表示 外部传入的值
                name = value;
            }
        }

        public int Money
        {
            get
            {
                //解密处理 使要用的值比存储的实际值少5
                return money - 5;
            }
            set
            {

                //添加逻辑处理 
                if (money < 0)
                {
                    money = 0;
                    Console.WriteLine("钱不能小于0");
                }

                //加密处理 使存储的实际值比要用的值多5
                money = value + 5;
            }
        }



        #region 知识点三 成员属性中 get和set前 可以加访问修饰符

        // get和set前加访问修饰符需要注意
        // 1.默认不加 会使用属性申明时的访问权限
        // 2.加的访问修饰符要低于属性的访问权限
        // 3.不能让get和set的访问权限都低于属性的权限

        //实例
        public int Age
        {
            //加的访问修饰符要低于属性的访问权限 
            //要保证外面高级的访问权限修饰符有作用
            //可以private protected 不能public(同级也会报错)
            //public get 报错

            //加了private后 外面只能set 不能get
            private get
            {
                return age;
            }



            //不能让get和set的访问权限都低于属性的权限 会报错
            //private set 报错
            //protected set 报错
            set
            {
                //添加逻辑处理 
                if (age < 0)
                {
                    age = 0;
                    Console.WriteLine("年龄不能小于0");
                }
                age = value;
            }

        }

        #endregion

        #region 知识点四 get和set可以只有一个

        //写get和set时注意:
        //只有一个时  没必要在前面加访问修饰符
        //一般情况下 只会出现 只有 get的情况 基本不会出现只有set

        //实例
        public bool Sex
        {
            get
            {
                return sex;
            }

            //自只有set不会报错
            //set
            //{
            //    sex = value;
            //}
        }

        #endregion

        #region 知识点五 自动属性

        //作用:外部能得不能改的特征
        //如果类中有一个特征是只希望外部能得不能改的 又没什么特殊处理
        //那么可以直接使用自动属性

        //声明个上面没有对应成员变量的属性
        //可以理解为自动生成一个成员变量
        public float Height
        {
            //没有在get和set中写逻辑的需求或者想法
            get;
            private set;
        }

        #endregion

    }
    #endregion

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("成员属性");

            //主函数内

            #region 知识点六 成员属性的使用

            Person p = new Person();
            p.Name = "林文韬";//执行的是set语句块
            Console.WriteLine(p.Name);//林文韬 执行的是get语句块

            p.Money = 1000;
            Console.WriteLine(p.Money);//1000 但实际存到内存的是1005

            p.Age = 22;
            //Console.WriteLine(p.Age);//成员属性Age的get是私有 不能访问 会报错

            Console.WriteLine(p.Sex);//False 默认值
            //p.Sex = true;//不能修改 没有设置

            #endregion
        }
    }


    //总结
    //1.成员属性概念:一般是用来保护成员变量的
    //2.成员属性的使用和变量一样 外部用对象点出
    //3.get中需要return内容 ; set中用value表示传入的内容
    //4.get和set语句块中可以加逻辑处理
    //5.get和set可以加访问修饰符,但是要按照一定的规则进行添加
    //6.get和set可以只有一个
    //7.自动属性是属性语句块中只有get和set,一般用于 外部能得不能改这种情况
}

7.3 练习题

定义一个学生类,有五种属性,分别为姓名、性别、年龄、CSharp成绩、Unity成绩

  • 有两个方法:

    • 一个是打招呼:介绍自己交XX,今年几岁了。是男同学还是女同学
    • 另一个是计算自己总分数和平均分并显示的方法
  • 使用属性完成:

    • 性别只能是男或女
    • 年龄必须是0 ~ 150岁之间
    • 成绩必须是0 ~ 100
  • 实例化两个对象并测试

class语句块外 namespace语句块内

// class语句块外 namespace语句块内
// 学生 类
class Student
{
    //成员变量
    //姓名、性别、年龄、CSharp成绩、Unity成绩
    //姓名用了自动属性 因为名字可以不用做逻辑
    private int age;
    private int cSharp;
    private int unity;
    private string sex;

    //成员属性
    //姓名、性别、年龄、CSharp成绩、Unity成绩
    //姓名用了自动属性 因为名字可以不用做逻辑
    public string Name
    {
        get;
        set;
    }
    public string Sex
    {
        get
        {
            return sex;
        }
        set
        {
            //性别只能是男或女 否则不男不女
            if (value != "男" && value != "女")
            {
                sex = "不男不女";
            }
            else
            {
                sex = value;
            }
        }
    }
    public int Age
    {
        get
        {
            return age;
        }
        set
        {
            //年龄必须是0 ~150岁之间
            if (value < 0)
            {
                age = 0;
            }
            else if (value > 150)
            {
                age = 150;
            }
            else
            {
                age = value;
            }
        }
    }
    public int CSharp
    {
        get
        {
            return cSharp;
        }
        set
        {
            //成绩必须是0 ~100
            if (value < 0)
            {
                cSharp = 0;
            }
            else if (value > 100)
            {
                cSharp = 100;
            }
            else
            {
                cSharp = value;
            }
        }
    }
    public int Unity
    {
        get
        {
            return unity;
        }
        set
        {
            //成绩必须是0 ~100
            if (value < 0)
            {
                unity = 0;
            }
            else if (value > 100)
            {
                unity = 100;
            }
            else
            {
                unity = value;
            }
        }
    }

    //成员方法
    //打招呼方法
    public void SayHellow()
    {
        Console.WriteLine("我叫{0},今年{1}岁了,是{2}同学", Name, Age, Sex);
    }
    //计算自己总分数和平均分并显示方法
    public void ShowInfo()
    {
        int sum = CSharp + Unity;
        float avg = sum / 2f;
        Console.WriteLine("总分{0},平均分{1}", sum, avg);
    }
}

主函数内

// 主函数内
Student s1 = new Student();
s1.Name = "林文韬";
s1.Age = 160;
s1.Unity = 150;
s1.CSharp = 150;
s1.Sex = "超人";
s1.SayHellow();//我叫林文韬,今年150岁了,是不男不女同学
s1.ShowInfo();//总分200,平均分100

Student s2 = new Student();
s2.Name = "亲爱的同学";
s2.Age = 20;
s2.Unity = 80;
s2.CSharp = 90;
s2.Sex = "女";
s2.SayHellow();//我叫亲爱的同学,今年20岁了,是女同学
s2.ShowInfo();//总分170,平均分85

7.4 练习题代码

using System;

namespace Lesson5_练习题
{
    #region 练习题一
    //定义一个学生类,有五种属性,分别为姓名、性别、年龄、CSharp成绩、Unity成绩
    //有两个方法:
    //一个打招呼:介绍自己交XX,今年几岁了。是男同学还是女同学
    //计算自己总分数和平均分并显示的方法
    //使用属性完成:
    //性别只能是男或女
    //年龄必须是0 ~150岁之间
    //成绩必须是0 ~100
    //实例化两个对象并测试

    //class语句块外 namespace语句块内

    // 学生 类
    class Student
    {
        //成员变量
        //姓名、性别、年龄、CSharp成绩、Unity成绩
        //姓名用了自动属性 因为名字可以不用做逻辑
        private int age;
        private int cSharp;
        private int unity;
        private string sex;

        //成员属性
        //姓名、性别、年龄、CSharp成绩、Unity成绩
        //姓名用了自动属性 因为名字可以不用做逻辑
        public string Name
        {
            get;
            set;
        }
        public string Sex
        {
            get
            {
                return sex;
            }
            set
            {
                //性别只能是男或女 否则不男不女
                if (value != "男" && value != "女")
                {
                    sex = "不男不女";
                }
                else
                {
                    sex = value;
                }
            }
        }
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                //年龄必须是0 ~150岁之间
                if (value < 0)
                {
                    age = 0;
                }
                else if (value > 150)
                {
                    age = 150;
                }
                else
                {
                    age = value;
                }
            }
        }
        public int CSharp
        {
            get
            {
                return cSharp;
            }
            set
            {
                //成绩必须是0 ~100
                if (value < 0)
                {
                    cSharp = 0;
                }
                else if (value > 100)
                {
                    cSharp = 100;
                }
                else
                {
                    cSharp = value;
                }
            }
        }
        public int Unity
        {
            get
            {
                return unity;
            }
            set
            {
                //成绩必须是0 ~100
                if (value < 0)
                {
                    unity = 0;
                }
                else if (value > 100)
                {
                    unity = 100;
                }
                else
                {
                    unity = value;
                }
            }
        }


        //成员方法
        //打招呼方法
        public void SayHellow()
        {
            Console.WriteLine("我叫{0},今年{1}岁了,是{2}同学", Name, Age, Sex);
        }
        //计算自己总分数和平均分并显示方法
        public void ShowInfo()
        {
            int sum = CSharp + Unity;
            float avg = sum / 2f;
            Console.WriteLine("总分{0},平均分{1}", sum, avg);
        }
    }
    #endregion
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("成员属性练习题");

            //主函数内

            Student s1 = new Student();
            s1.Name = "林文韬";
            s1.Age = 160;
            s1.Unity = 150;
            s1.CSharp = 150;
            s1.Sex = "超人";
            s1.SayHellow();//我叫林文韬,今年150岁了,是不男不女同学
            s1.ShowInfo();//总分200,平均分100

            Student s2 = new Student();
            s2.Name = "亲爱的同学";
            s2.Age = 20;
            s2.Unity = 80;
            s2.CSharp = 90;
            s2.Sex = "女";
            s2.SayHellow();//我叫亲爱的同学,今年20岁了,是女同学
            s2.ShowInfo();//总分170,平均分85
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏