C# 什么是属性

1.属性Aproperty)是一种用于访问对象或类型的特征的成员,特征反映了状态

2.属性是字段的自然扩展

  • 从命名上看,field更偏向于实例对象在内存中的布局,property更偏向于反映现实世界对象的特征
  • 对外:暴露数据,数据可以是存储在字段里的,也可以是动态计算出来的
  • 对内:保护字段不被非法值"污染"

3.属性由Get/Set方法对进化而来

最初的用来保护字段的Get/Set方法,如以下代码:(C++与Java语言仍然在使用Get/Set方法)

cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PropertyExample
{
    internal 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(20);
                int avgAge = (stu1.GetAge() + stu2.GetAge() + stu3.GetAge()) / 3;//获取值
                Console.WriteLine(avgAge);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }
    }

    class Student
    {
        private int age;//私有字段,从外界不能直接访问该字段

        //用一对方法将该字段保护起来,一个方法获取值(Get),另一个为字段设置值(Set)
        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.");
            }
        }
    }
}

分析代码:

  1. age字段:这是一个私有字段,用于存储年龄的值。
  2. GetAge方法 :这是一个公有方法,用于获取age字段的值。
  3. SetAge方法 :这是一个公有方法,用于设置age字段的值。它还包含了一些验证逻辑,确保年龄值在合理的范围内。

而属性提供了一种更简洁的方式来访问和修改字段的值,并允许您在访问或修改字段时执行额外的操作,如验证等。

cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PropertyExample
{
    internal 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 = 20;
                int avgAge = (stu1.Age + stu2.Age + stu3.Age) / 3;
                Console.WriteLine(avgAge);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }
    }

    class Student
    {
        private int age;//私有字段,从外界不能直接访问该字段

        public int Age  //属性,首字母大写
        {
            get
            {
                return this.age;
            }
            set
            {
                //不用声明value,在特定的方法中为上下文关键字,代表传进来的值
                if (value >= 0 && value <= 120)
                {
                    this.age = value;
                }
                else
                {
                    throw new Exception("Age value has error.");
                }
            }

            
        }
    }
}

代码分析:

  • 定义了一个Student类,它包含一个私有字段age
  • 还定义了一个属性Age,它包含了getset访问器。
  • get访问器用于获取age字段的值。
  • set访问器用于设置age字段的值,并包含了一些验证逻辑,确保年龄值在合理的范围内。
  • Main方法中,我们创建了三个Student类的新实例,并通过属性Age直接设置年龄为20。
  • 接着计算了这三个学生的平均年龄,并将结果输出到了控制台。
  • 异常处理逻辑用于捕获可能发生的异常。
相关推荐
蒙娜丽宁1 小时前
Rust 性能优化指南:内存管理、并发调优与基准测试案例
开发语言·性能优化·rust
豐儀麟阁贵1 小时前
5.2 类
java·开发语言
九皇叔叔1 小时前
Java循环结构全解析:从基础用法到性能优化(含经典案例)
java·开发语言·python
JanelSirry1 小时前
如何查看java死锁?具体怎么做,怎么避免
java·开发语言
小龙报2 小时前
《算法通关指南之C++编程篇(5)----- 条件判断与循环(下)》
c语言·开发语言·c++·算法·visualstudio·学习方法·visual studio
郝学胜-神的一滴2 小时前
C++ STL(标准模板库)深度解析:从基础到实践
linux·服务器·开发语言·c++·算法
LL_break2 小时前
线程3 JavaEE(阻塞队列,线程池)
java·开发语言·java-ee·线程·线程池·阻塞队列
Fortunate Chen2 小时前
初识C语言12. 结构体(自定义类型的核心工具)
c语言·开发语言·笔记
刚入坑的新人编程2 小时前
算法训练.17
开发语言·数据结构·c++·算法
汤姆yu2 小时前
基于python大数据深度学习的酒店评论文本情感分析
开发语言·python·深度学习