C#学习笔记 属性

  • 什么是属性
    • 属性(property)是一种用于访问对象或类型的特征的成员,特征反映了状态
    • 属性是字段的自然扩展
      • 从命名上看,field更偏向于实例对象在内存中的布局property更偏向于反映现实世界对象的特征
      • 对外:暴露数据,数据可以是存储在字段里的,也可以是动态计算出来的
      • 对内:保护字段不被非法制“污染”
    • 属性由Get/Set方法进化而来
    • 又一个“语法糖”——属性背后的秘密
  • 属性的声明
    • 完整声明——后台(back)成员变量与访问器(注意使用code snippet和refactor工具)
    • 简略声明——只有访问器(查看1L代码)
    • 动态计算值的属性
    • 注意实例属性和静态属性
    • 属性的名字一定是名词
    • 只读属性——只有getter没有setter
      • 尽管语法上正确,几乎没有人使用“只写属性”,因为属性的主要目的是通过向外暴露数据而表示对象/类型的状态
  • 属性和字段的关系
    • 一般情况下,它们都用于表示实体(对象或类型)的状态
    • 属性大多数情况下是字段的包装器(wrapper)
    • 建议:永远使用属性(而不是字段)来暴露数据,即字段永远都是private或protected的

字段:

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Student stu1 = new Student();
                stu1.SetAge(20);
                Student stu2 = new Student();
                stu2.SetAge(20);
                Student stu3 = new Student();
                stu3.SetAge(200);

                int avgAge = (stu1.GetAge() + stu2.GetAge() + stu3.GetAge())/3;
                Console.WriteLine(avgAge);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
    class Student
    {
        private int age;
        public int GetAge()
        //用于获取字段值的方法
        {
            return this.age;
        }
        public void SetAge(int value)
        //为字段设置值的方法(不需要返回值)
        {
            if (value>=0 && value <=120)
            {
                this.age = value;
            }
            else
            {
                throw new Exception("Age value has error!");
            }
        }
    }

属性:

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Student stu1 = new Student();
                stu1.Age = 20;
                Student stu2 = new Student();
                stu2.Age = 20;
                Student stu3 = new Student();
                stu3.Age = 200;

                int avgAge = (stu1.Age + stu2.Age + stu3.Age)/3;
                Console.WriteLine(avgAge);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
    class Student
    {
        private int age;
        public int Age
        {
            get
            {
                return this.age;
            }
            set
            {
                if (value>=0 && value<=120)   //C#默认的变量value,上下文关键字,不能改
                {
                    this.age = value;
                }
                else
                {
                    throw new Exception("Age value has error!");
                }
            }
        }
    }

属性的完整声明:
propfull
完整声明
属性的简略声明:
prop
简略声明
快速声明属性:

光标放在字段名上,按Ctrl+R,E。

回车,或者点击Apply。

静态属性:

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Student.Amount = 100;
                Console.WriteLine(Student.Amount);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
    class Student
    {
        private static int amount;
        //声明静态属性
        public static int Amount
        {
            get { return amount; }
            set 
            {
                if (value>=0)
                {
                    Student.amount = value;
                }
                else
                {
                    throw new Exception("Amount must greater than 0.");
                }
            }
        }
    }

动态计算值的属性:
①:

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Student stu = new Student();
                stu.Age = 14;
                Console.WriteLine(stu.CanWork);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
    class Student
    {
        private int age;
        public int Age
        {
            get { return age; }
            set
            {
                age = value;
            }
        }

        private bool canWork;
        public bool CanWork
        {
            get
            {
                if (this.age >= 16)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
    }

②:

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Student stu = new Student();
                stu.Age = 14;
                Console.WriteLine(stu.CanWork);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
    class Student
    {
        private int age;
        public int Age
        {
            get { return age; }
            set
            {
                age = value;
                this.CalculateCanWork();
                //在调用set方法同时调用CalculateCanWork,来判断age是否大于等于16.
            }
        }

        private bool canWork;
        public bool CanWork
        {
            get
            {
                return canWork;
            }
        }

        private void CalculateCanWork()
        {
            if (this.age >= 16)
            {
                this.canWork = true;
            }
            else
            {
                this.canWork = false;
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值