针对C#中的字段和属性,很多初学者无法区分这两者之间的区别。
字段与属性比较
字段;是一种“成员变量”,一般在类的内部做数据交互使用,占用内存空间。
属性:a.是一种逻辑变量,一般跟字段一起结合起来使用,是字段的扩展,并不占用实际的内存。
b.属性其实就是外界访问私有字段的入口,属性本身不保存任何数据。在面向对象设计中主要使用属性描述对象的静态特征。
c.属性设置过程中一般会用到get和set两个方法。可以在方法里加入逻辑处理数据,灵活拓展使用。
标注:因为属性不占用实际内存,所以属性不能用于方法的ref类型参数
下面举个栗子,如下所示
public Class Student
{
private DateTime _Birthday;
private string _Name;
public string Name
{
get{return _Name;}
set {this._Name=value;}
}
public int Age
{
get {return DateTime.Now.Year-this._Birthday.Year}
}
}
在这个例子中,_Name是字段,而Name为属性,Name属性的get方法为返回学生的姓名,Set方法则是对_Name字段进行赋值。
Age也是类中的一个属性,只不过这个属性是只读属性,get方法返回格式化之后的年龄数据,这就是使用属性很好的控制了返回数据的格式,不然还得专门写个方法去格式化数据。
同时,属性也可以通过相应的条件对字段赋值进行相应的限制,比如我们要限定Student的名字长度最长不能超过5个字,超过5个字的,我们就只截取前面5个字符即可。
为了实现这种效果,我们可以在set方法内做逻辑规则运算,即可轻松实现想要的效果,如下所示,设置Name属性为:
Public string Name
{
get {return _Name}
set
{
if(value.Length>5)
this._Name=value.Substring(0,5);
else
this._Name=value;
}
}
直接对字段赋值是无法达到上述效果,你需要在每次给字段赋值的时候,调用函数获取理想值。使用属性可以完美避免非法数据。
使用属性的情况:
- 要求字段只能读或者只能写;
- 需要限制字段的取值范围;
- 在改变一个字段的值的时候希望改变对象的其它一些状态;
使用字段的情况:
- 允许*读写;
- 取值范围只受数据类型约束而无其他任何特定限制;
- 值的变动不需要引发类中其它任何成员的相应变化。
最后,附上我的ASP.NET学习群,欢迎各位同行入群指导交流。技术群:【ASP.NET技术社区】872894940