属性的作用:
先看一个简单的作用
private string studentAge;
public string StudentAge
{
get {
return studentAge;
}
set {
if(studentAge>16)&&(studentAge<20)//判断是否是程序的要求
studentAge=value;
else
Console.WriteLine("不是指定的年龄范围!");
}
}
属性是面向对象中的一个重要概念,首先还是先观察一下属性的写法特点:
属性由两大部分组成:私有字段、公有属性
属性部分包括 get 、set 两个特殊的方法,在这个两个方法中,get是返回对应私有变量的值,我们称为“获取属性值”,set是给对应的私有变量赋值,我们称为“给属性赋值”,并且这个值自动保存在value中,然后通过value个私有变量赋值的。通过调试程序的赋值和取值我们可以观察get和set的调用时机,
请大家观察下图,首先给get和set打上断点:
观察程序执行:
属性是外部调用字段的一个入口。
因为字段一般都是私有,私有字段外界是无法访问的,外界想访问私有字段,我们可以把这个字段封装一个属性
public 的字段与属性的区别
先看下面这个程序
Class student
{
public int Age;
}
static void Main (string[] args)
{
student Student=new student();
Student.Age= -20;
string strStudent =Stuent.Age;
Console.WriteLine("This student age is:{0}",strStudent);
}
想想这样的结果会是什么呢?
This student age is:-20 是不是这个学生在倒起活呢?所以属性对字段就有封装保护作用。
private string studentAge;
public string StudentAge
{
get
{return studentAge;}
set
{
if(studentAge>16)&&(studentAge<20)//判断是否是程序的要求
studentAge=value;
else
Console.WriteLine("不是指定的年龄范围!");
}
}
通过上面的示例,大家可以看出,显示这样的程序设计很不安全,这就是直接公开私有字段无法解决的问题。但是使用属性就能解决,因为属性给我们提供的get和set方法是可以在里面添加业务逻辑的,如下:
private string studentAge;public string StudentAge
{
get
{
return studentAge;
}
set
{
if(studentAge>16) //添加的业务逻辑
studentAge=value; //添加的业务逻辑
else //添加的业务逻辑
Console.WriteLine("不是指定的年龄范围!"); //添加的业务逻辑
}
}
属性可以是“只读的”
先看下面这段会报错代码:
Class Student
{
private ing age ;
public int Age
{
get{return age;}
}
}
static void Main(string[] args)
{
Student stu=new Student();
stu.Age=20;
}
可以有人会问会报什么样的错误呢?
无法对属性或索引器" ****.Student.Age "赋值--它是只读的
那么属性设为只读的有什么好处呢?
例如:
我们要根据人的生日来计算出他的年龄。
Class Student
{
private DateTime birthday;
public DateTime Birthday
{
get{return birthday;}
set{birthday =value;}
}
public int Age
{
get
{
return DateTime.Now.Year-birthday.Year;
}
}
}
static void Main(string[] args)
{
Student stu=new Student();
stu.Birthday=Convert .ToDataTime("1988-2-3");
Console.WriteLine( "my old {0}",stu.Age);
}
属性的简要写法:
在 .Net 3.0出现以后,属性可以使用简写的方式。
public int age {get ; set ;}
public string Name { get ; set ;}
简要写法还不支持只读或只写:
public int age { get ; }//错