屬性的作用:
先看一個簡單的作用
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 ; }//錯