- 什么是属性
- 属性(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!");
}
}
}
}
属性的完整声明:
属性的简略声明:
快速声明属性:
光标放在字段名上,按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;
}
}
}