C# 属性详解
属性Property是 C# 中最重要的语言特性之一它用于安全地访问对象的数据。可以把属性理解为字段变量的升级版它既能保存数据又能控制数据的读取和修改。简单来说字段 直接存数据属性 控制数据如何存和取一、为什么需要属性假设有一个学生类。不推荐直接公开字段class Student { public string Name; public int Age; }使用Student stu new Student(); stu.Name 张三; stu.Age -10; // 错误的数据也可以赋值问题无法限制年龄无法验证数据是否合法后期不好维护所以C# 提供了属性(Property)。二、最基本的属性class Student { private string name; public string Name { get { return name; } set { name value; } } }使用Student stu new Student(); stu.Name 张三; Console.WriteLine(stu.Name);输出张三图解外部访问 stu.Name 张三 │ ▼ set { name value; } │ ▼ private name读取Console.WriteLine(stu.Name); │ ▼ get { return name; }三、get 和 setget读取数据get { return name; }例如Console.WriteLine(stu.Name);实际上执行的是return name;set修改数据set { name value; }其中value是系统自动提供的变量。例如stu.Name 李四;实际上value 李四; name value;四、value 是什么很多初学者容易疑惑。例如stu.Name Tom;执行流程Tom ↓ value Tom ↓ name value ↓ name Tom所以value就是赋值时传进来的值。五、属性的完整执行过程class Student { private string name; public string Name { get { Console.WriteLine(读取); return name; } set { Console.WriteLine(写入); name value; } } }测试Student stu new Student(); stu.Name Tom; Console.WriteLine(stu.Name);输出写入 读取 Tom六、属性最大的作用——数据验证例如年龄class Student { private int age; public int Age { get { return age; } set { if (value 0 value 150) { age value; } else { Console.WriteLine(年龄不合法); } } } }测试Student stu new Student(); stu.Age -10;输出年龄不合法再测试stu.Age 18; Console.WriteLine(stu.Age);输出18七、自动属性Auto Property如果不需要验证可以简写。以前private string name; public string Name { get { return name; } set { name value; } }简写public string Name { get; set; }编译器会自动生成隐藏字段。使用Student stu new Student(); stu.Name Tom;八、只读属性只允许读取public string Name { get; }赋值public Student(string name) { Name name; }测试Student stu new Student(Tom); Console.WriteLine(stu.Name);外部不能stu.Name Jack;会报错。九、只写属性几乎不用。private string password; public string Password { set { password value; } }外部user.Password 123456;可以。但是Console.WriteLine(user.Password);报错。十、不同访问权限例如public string Name { get; private set; }表示外部Console.WriteLine(stu.Name);可以。但是stu.Name Tom;不允许。类内部Name Tom;可以。十一、初始化属性public string Name { get; set; } 未知;创建对象Student stu new Student(); Console.WriteLine(stu.Name);输出未知十二、表达式属性如果只有一句代码。以前public string Name { get { return name; } }可以写成public string Name name;或者public int Square number * number;使用Console.WriteLine(obj.Square);十三、计算属性属性并不一定存数据。例如class Rectangle { public double Width { get; set; } public double Height { get; set; } public double Area { get { return Width * Height; } } }使用Rectangle r new Rectangle(); r.Width 5; r.Height 6; Console.WriteLine(r.Area);输出30Area 没有真正保存数据。而是Width × Height实时计算。十四、对象初始化器属性支持Student stu new Student { Name Tom, Age 18 };等价于Student stu new Student(); stu.Name Tom; stu.Age 18;十五、属性和字段的区别字段Field属性Property保存数据控制数据访问可以 public推荐 private无法验证可以验证无逻辑可以写逻辑不安全更安全速度略快功能更强开发建议字段通常设为private仅类内部使用。属性通常设为public供外部访问对象数据。十六、实际开发规范class Student { private string name; private int age; public string Name { get name; set name value; } public int Age { get age; set { if (value 0) age value; } } }或者更现代的写法class Student { public string Name { get; set; } public int Age { get; set; } }