类的“属性(Property)”
- 字段+get/set方法=属性
赋值
// 属性的经典实现方法
public class MyTestClass
{
// 私有变量用于存储数据
private string _myprop="";
public string Myprop
{
get // 读访问器
{
return _myprop;
}
set // 写访问器
{
_myprop = value; // value是一个拥有特殊含义的关键字,代表外界传入的值。
}
}
}
使用
static void Main(string[] args)
{
MyTestClass obj = new MyTestClass();
// 向属性赋值
obj.Myprop = "Hello";
// 读取属性值
Console.WriteLine(obj.Myprop);
Console.ReadKey();
}
实现自定义属性的要点
- 定义一个私有字段用于存储属性数据。
- 设计一个get方法,当读取属性值时,向外界返回私有字段的当前值。
- 设计一个set方法,当向属性赋值时,其自动隐含的value参数保存外界传入的值,应将此值传给前面定义的私有字段。
“属性”经典实现方法弊端
- 存在的问题:当一个类中存在很多的属性,而这些属性又采用类似的方法编写时,这是一个烦人的工作,要敲很多的代码!
C#3.0的改进——自动实现的属性
public class MyTestClass
{
private string _myprop="";
public string Myprop
{
get;
set;
}
}
“属性”比“字段”多了哪些东西?
public class Person
{
private int _age = 0;
public int Age
{
get
{
return _age;
}
set
{
if (value < 0)
_age = 0;
else
_age = value;
}
}
}
- 当使用经典写法时,我们可以很容易地在读/写属性时“插入一些”特定的代码,完成诸如“检验数据”、“显示信息”、“触发事件”等工作,这是单纯的字段所不具备的特性。
“属性”的各种“玩法”......
- 定义一个属性时,get/set方法并不需要同时存在,它们的存取权限也可以不一样,各种情况的不同组合,将影响到属性的存取特性......
// 只读属性
public string ReadOnlyProp
{
get;
}
// 只写属性
public string WriteOnlyProp
{
set
{
_value = value;
}
}
// 外界可读,内部可写属性
public string PublicReadPrivateSetProp
{
get;
private set;
}
// 直接给定初始值的属性(适用C# 6.0)
public string AutoInitProp
{
get;
} = "Hello";
开发建议
- 在实际开发中,多用属性少用字段,尤其是杜绝(“公有(public)”)字段,过多的公有字段,可能会损害代码的可维护性。