屬性是字段向方法的過渡
1

public class Person
2
{
3
4
public int age;//直接公開字段,無法控制使用者輸入非法的值
5
6
7
//Java模式的對Age控制方式,需要兩個方法,Get和Set。麻煩麻煩阿!
8
public int GetAge()
9
10
return Age;
11
}
12
13
public void SetAge(int personAge)
14
15
if (personAge < 18)
16
17
personAge = 18;
18
19
if (personAge>81)
20
21
personAge = 81;
22
23
age = personAge;
24
25
26
//C#模式的Age控制方式,Set和Get是屬性的兩個通路器,管理友善
27
public int Age
28
29
set
30
31
if (value < 18)
32
33
value = 18;
34
35
if (value > 81)
36
37
value = 81;
38
39
age = value;
40
41
get
42
43
return age;
44
45
46
47
48
現在我們來看一個應用,描述部門和員工的一對多的關系。先看一個錯誤的設計:

public class Space
public static void Main(string[] args)
Department dep = new Department();
//錯誤一,Staffs所存儲的值類型無法被控制。Staffs又可以放字元串,又可以放對象 資料無法統一。
dep.Staffs.Add("leo"); //放字元串
dep.Staffs.Add(new Staff("King")); //放對象
//錯誤二,一旦Department對Staffs的設計改變(比如用數組描述),周遊代碼就要改變
//周遊1:類Department将Staffs描述為字元串
for (int i = 0; i <= dep.Staffs.Count - 1; i++)
System.Console.WriteLine(dep.Staffs[i]);
//周遊2:類Department将Staffs描述為數組
for (int i = 0; i <= dep.Staffs.Length - 1; i++)
//造成使用者必須根據Staffs資料描述的方式不同而編寫不同的代碼的原因為類Department設計不合理。


public class Department
//這是一個錯誤的設計,向使用者暴露了Staffs的資料結構
public System.Collections.ArrayList Staffs = new System.Collections.ArrayList();


public Staff[] Staffs = new Staff[] { new Staff("leo"), new Staff("King") };


public class Staff
public Staff(string name)
Name = name;
public string Name;
好的設計方法是向使用者關閉資料結構的細節

//無論将來Staffs的資料結構有什麼變化,調用的代碼不會有變化
dep.AddStaff(new Staff("leo"));
dep.AddStaff(new Staff("King"));
for (int i = 0; i <= dep.StaffsCount - 1;i++ )
System.Console.WriteLine(dep.GetStaffFromIndex(i).Name);


//這是正确的設計
private System.Collections.ArrayList Staffs = new System.Collections.ArrayList(); //private隐藏了Staffs的資料結構
public int StaffsCount //統一周遊代碼
return Staffs.Count;
public int AddStaff(Staff staff) //統一Staffs的資料結構
return this.Staffs.Add(staff);
public void Remove(Staff staff)
this.Staffs.Remove(staff);
public Staff GetStaffFromIndex(int index)
return (Staff)this.Staffs[index];


49
50
51
52
53
54
55
如果我們引入索引器,那代碼能更合理

System.Console.WriteLine(dep[i].Name); //注意下标


private System.Collections.ArrayList Staffs = new System.Collections.ArrayList();
public int StaffsCount
public int AddStaff(Staff staff)
public Staff this[int index]
Staff[index] = value;
return (Staff)Staff[index];
注意代碼的第40的變化,不過在一個類中,隻能有一個this[int index]。
注意使用了第40行的索引器,第12行可以象數組下标一樣用啦。
不過,這樣的設計還不完善,請看下篇,初見繼承威力。
本文轉自shyleoking 51CTO部落格,原文連結:http://blog.51cto.com/shyleoking/806278