属性提供灵活的机制来读取、编写或计算私有字段的值。
属性是一种用于访问对象或类的特性的成员。
属性有访问器,这些访问器指定在它们的值被读取或写入时需要执行的语句。
属性提供了一种机制,它把读取和写入对象的某些特性与一些操作关联起来。
可以像使用公共数据成员一样使用属性,但实际上属性是称为“访问器”的一种特殊方法,这使得数据在被轻松访问的同时,仍能提供方法的安全性和灵活性。
自定义属性在类中是通过以下方式声明的:指定属性的访问级别、属性类型、属性名称,然后是声明get访问器和(或)set访问器的代码模块,语法格式如下:
访问修饰符 数据类型 属性名
{
get
{
return 变量名;
}
set
{
变量名=value ;
}
}
value是隐式参数,此参数类型是属性类型。
程序中调用属性的语法格式如下:
对象名.属性名
虽然属性中有访问器,但是赋值的时候并不直接调用访问器,而是直接调用属性并赋值,就像调用公有字段直接对其赋值似的。
下面的例子能说明属性和字段(数据成员)的区别:
public class Date
{
private int Day = 7;
public int day
{
get
{
return Day;
}
set
{
if((value>0)&&(value<8))
{
Day = value ;
}
}
}
}
类比java,将java中的私有数据成员的get方法和set方法封装,然后给这个封装体起个名字,就和这里的属性差不多了。
当在VS、C#项目中,定义一个私有字段,如:
private int xx ;
此时按下(alt+enter)组合键,VS会提示:
封装字段:“xx”(并使用属性)
封装字段:“xx”(但仍使用字段)
封装的代码是一样的。
public int xx1{get=>xx ; set=>xx = value ; }
"xx1"是VS自动生成的,以区别"xx"。
如果属性只是对私有字段的封装,是对访问器的封装,那么属性到底是什么?和字段有什么差别?
属性还具有以下特点:
属性可以向程序中添加元数据。
程序可以使用反射检查自己的元数据。
通常使用属性与COM交互.
属性提供功能强大的方法以将声明信息与C#代码相关联,一旦属性与程序实体关联,即可使用反射技术对属性进行查询。
属性和反射有关,这可能是属性与字段的重要的区别之一。