在类的设计中,如果将成员变量设置成公有变量,那么外部就可以随意访问甚至修改成员变量的值。为了成员变量的安全性考虑。因此设计了字段和属性,通过属性来访问字段的值。
字段相当于类于成员变量。通常设置为私有型,不被外部直接访问和修改。
属性相当于访问成员变量的方法,通常设置为公有型,可以被外部访问。
属性没有实体,仅充当一个方法的作用。相当于get(),set()方法,是对访问字段值的封装,其封装逻辑可以自行定义。可以通过属性访问到字段的值或者修改字段的值。
比如:
一个学生对象的学生ID、姓名、性别,出生日期不能随意更改,年级、总分可以更改。外部需要访问该学生的信息时,学生ID、姓名、性别、年龄、年级、总分的属性可以get方法获得,set方法设置。年龄属性可以通过出生日期获得。
class Student
{
#region 字段
DateTime birthday;// 出生日期
#endregion
#region 简写自动属性
public long Id
{ get; set; }
public string? Name // property
{ get; set; }
public string? Sex
{ get; set; }
public short Class
{ get; set; }
public double Score
{ get; set; }
#endregion
#region 属性
public DateTime Birthday
{ get { return birthday; } set { birthday = value; } }
public short Age
{ get{ return (short)(DateTime.Now.Year - birthday.Year); } }
#endregion
public Student(long ID, string name, string sex, DateTime birth, short classNo, double score)
{
Id = ID;Name = name;Sex = sex;Class = classNo;Score = score; birthday = birth;
}
}
该类的属性的调用:
DateTime birth = new DateTime(2017,10,20);
Student s = new(10000,"zhangsan","男",birth,3,3.1415926);
Console.WriteLine($"学生信息:学生号[{s.Id}],姓名[{s.Name}],性别[{s.Sex}],出生日期[{s.Birthday}],分数[{s.Score}]");
Console.WriteLine($"今年是{DateTime.Now.Year}年。");
Console.WriteLine($"学生[{s.Name}],今年的年龄是:{s.Age}岁");
执行结果,仅供参考: