前情回顾:
成员属性:

访问修饰符 属性类型 属性名 { get{}; set{}; }
举个例子:
class Person { private int age; private string name; private bool sex;//三个我都用private修饰,外部不能访问. public string Name { get { //意味着这个属性可以获取的内容. //可以在返回之前添加一些逻辑规则. return name; //通过属性Name,我就可以访问成员变量name, } set { //可以在设置之前添加一些逻辑规则. name = value;//value关键字表示外部传入的值 } } }

因为我让属性前面的修饰符是,private,所以外面没法访问,
但却可以通过Name属性,来访问变量name.
static void Main(string[] args) { Person p = new Person(); p.Name = "leemoon";//这句是在执行成员属性Name里面的set语句块 Console.WriteLine(p.Name);//这句则是在使用get语句块 }
除此之外还能用来加密解密
class Person { private int money; private string name; private bool sex;//三个我都用private修饰,外部不能访问. public int Money { get { //解密 return money-5; } set { //加密 money = value+5; } } } internal class Program { static void Main(string[] args) { Person p = new Person(); p.Money = 1000;//我存进去的是1000,实际在堆里存的是1005 Console.WriteLine(p.Money);//解密出来之后又是1000. } }

public int Money { get { return money-5; } set { money = value+5; }
get,set默认前面的修饰符是public int Money 的public一样的.
当然也可以一个是public,一个是private,
当声明属性的访问修饰符是private也就是private int Money ,
get和set的的访问修饰符就不能是public,因为public是比private更高级的.
里面的权限一定要低于外面的权限.
但不能两个都是private,因为这样public int Money的public就没用了

class Person { private int money; private string name; private bool sex; public bool Sex { get { return sex; } } }
在调用我们一般只希望能得到这个数据,而不让去改他,所以只用get,就像这样
static void Main(string[] args) { Person p = new Person(); Console.WriteLine(p.Sex); }
就可以保护成员变量.
当然我也可以只改他
class Person { private int money; private string name; private bool sex; public bool Sex { set { sex = value; } } }
在调用就:
static void Main(string[] args) { Person p = new Person(); value = false; }但一般很少会,去改,而不得到它

class Person { private int money; private string name; private bool sex; public int Hight { get; set; } }
get和set没有任何的语句块,你可以把Hight看成一个特殊的成员变量,
在你写这个语句,把Name当成一个变量时public string Name { get; set; }
它其实会自己变成
private string _name; public string Name { get { return _name; } set { _name = value; } }
所以当我我们不用写逻辑的时候就可以直接不写变量,而是用属性当一个特殊变量;
用属性替代成员变量,起到能得不能改或者能改不能得,就像这样:
public int Hight { get; private set; } static void Main(string[] args) { Person p = new Person(); Console.WriteLine(p.Hight); }
题目:

using System; namespace 属性练习2 { class Employee { public string Name { get; set; } private string department; // 修正拼写 private int age; private int baseSalary; private int bonus; public int Age { get { return age; } set { if (value >= 18 && value <= 65) { age = value; } else { age = 18; // 超出范围设为默认值 } } } public int Bonus { get { return bonus; } set { if (value >= 0 && value <= 100000) { bonus = value; } else { bonus = 50000; } } } public int BaseSalary { get { return baseSalary; } set { if (value >= 0 && value <= 100000) { baseSalary = value; } else { baseSalary = 50000; } } } public string Department { get { return department; } set { // 关键修正:将 && 改为 || if (value == "研发部" || value == "市场部") { department = value; } else { department = "研发部"; } } } public void Introduction() { // 微调:去掉了多余的“部门”二字 Console.WriteLine($"大家好,我是{Name},年龄{Age},是{Department}的员工"); } public void Calculation() { int total = BaseSalary + Bonus; double avg = total / 2.0; // 使用 double 保证平均数精度 Console.WriteLine($"总工资: {total}, 平均是: {avg}"); } } internal class Program { static void Main(string[] args) { // 测试 1:合法数据测试(测试“市场部”是否能设置成功) Employee p1 = new Employee(); p1.Name = "leemoon"; p1.BaseSalary = 80000; p1.Bonus = 70000; p1.Age = 23; p1.Department = "市场部"; p1.Introduction(); p1.Calculation(); Console.WriteLine("-----------------------------------"); // 测试 2:非法数据过滤测试 Employee p2 = new Employee(); p2.Name = "jack"; p2.BaseSalary = 800002342; // 越界,自动变为 50000 p2.Bonus = -70000434; // 越界,自动变为 50000 p2.Age = 230; // 越界,自动变为 18 p2.Department = "保洁部"; // 不合法部门,自动变为 研发部 p2.Introduction(); p2.Calculation(); } } }
本文作者:Leemoon
本文链接:
版权声明:leemoon