[畢業生的商業軟件開發之路]C#類型成員
近期開始接觸到在校學生、高校實習生和畢業生,在此說一下筆者對這些徘徊在職場門口的學生一些建議,希望能給這些初學者進入軟件開發行業帶來一些幫助,使得畢業生能更順利的進入軟件開發公司開始職場生涯,人生來一個完美的轉彎。
--------------------------------------------------------------------------------
C#類型成員
類型、接口和結構體都包含若干個類型成員,類型成員有多種。
例如以下代碼定義了一個類。
2 {
3 /// <summary>
4 /// 靜態構造函數
5 /// </summary>
6 static PeopleClass()
7 {
8 System.Console.WriteLine("Start");
9 }
10
11 /// <summary>
12 /// 無參數的構造函數
13 /// </summary>
14 public PeopleClass()
15 {
16 }
17
18 /// <summary>
19 /// 有參數的構造函數
20 /// </summary>
21 /// <param name="code"></param>
22 /// <param name="name"></param>
23 public PeopleClass(string code, string name)
24 {
25 _Code = code;
26 _Name = name;
27 }
28
29 /// <summary>
30 /// 字段
31 /// </summary>
32 private string _Code = null;
33 /// <summary>
34 /// 屬性
35 /// </summary>
36 public string Code
37 {
38 get
39 {
40 return _Code;
41 }
42 set
43 {
44 _Code = value;
45 }
46 }
47
48 /// <summary>
49 /// 字段
50 /// </summary>
51 private string _Name = null;
52 /// <summary>
53 /// 屬性
54 /// </summary>
55 public string Name
56 {
57 get
58 {
59 return _Name;
60 }
61 set
62 {
63 _Name = value;
64 }
65 }
66 /// <summary>
67 /// 方法
68 /// </summary>
69 /// <returns></returns>
70 public override string ToString()
71 {
72 return _Code + " " + _Name;
73 }
74
75 private void RaiseNameChangedEvent()
76 {
77 if (NameChanged != null)
78 {
79 NameChanged(this, null);
80 }
81 }
82 /// <summary>
83 /// 事件
84 /// </summary>
85 public event EventHandler NameChanged = null;
86 }
這個類就包含了以下成員類型。
構造函數
在代碼中定義了兩個名為“PeopleClass”的方法,這種和類型同名的方法稱為類型的構造函數。構造函數沒有任何返回值,構造函數可以帶參數,可以定義可用范圍。
若在代碼中沒有定義任何構造函數,則系統會默認定義了一個無參數的公開的構造函數。
字段
在代碼中使用“private string _Code = null;”定義了一個字段。在這里關鍵字“private”定義了該字段的引用范圍為私有的,代碼“string”說明了字段的數據類型,代碼“_Code”為字段的名稱,“=null”為字段的默認值。
屬性
以下代碼定義了一個屬性。
{
get
{
return _Name;
}
set
{
_Name = value;
}
}
在這里“public”定義了該屬性的引用范圍為公開的,代碼“string”說明了屬性的數據類型,“Name”說明了屬性的名稱,“get”代碼塊定義了如何獲得屬性值,“set”代碼塊定義了如何保存屬性值,在“set”代碼塊中,關鍵字“value”是一個默認的參數,代表從外界傳入的需要保存的數值。在C#中,只有屬性的“set”代碼塊中,關鍵字“value”才有效,其他地方出現的“value”必定是某個標識符,而不是關鍵字。
方法
以下代碼定義了一個方法
{
return _Code + " " + _Name;
}
在這里“public”定義了該方法的為公開的;代碼“override”說明該方法是重載了基類的相同簽名的方法;“string”就是方法的返回值類型;“ToString”為方法名稱;圓括號“()”列表就是列出方法的參數,這里內容為空表示該函數沒有任何參數。
方法開頭后面就是方法體了,在里面使用“return”就是退出本函數并返回一個字符串值。
方法有返回值和參數列表,返回值可以為任意數據類型,若函數沒有返回值,則使用關鍵字void來定義方法,比如“public void MyMethod( )”。有種說法,具有返回值的方法稱為函數,沒有返回值的方法稱為方法。在本書中沒有這種說法,統一稱為對象成員方法。
若定義方法具有返回值時,在方法體內的函數必須使用return語句返回運算結果,否則會編譯錯誤,這點和VB是不同的。在VB中若沒有使用return語句返回運算結果,則會自動的返回參數數據類型對應的默認值。
方法具有若干個參數,對于值類型的參數,C#默認是按照值傳遞的,但可以使用關鍵字out或ref來實現按引用傳遞;對于引用類型的參數,永遠是按照引用傳遞的。例如“public void MyMethod( ref int parameter )”
|
參數修飾符 |
說明 |
|
無修飾 |
對于值類型的參數按值傳遞,方法體內修改參數值不會影響方法體外的參數變量的值。 |
|
out |
說明該參數包含了方法的運算結果,此時參數是按引用傳遞的,而且在方法體內必須設置好參數值,否則編譯錯誤,方法體內修改參數值會傳導到方法體外用作方法產生的變量的值。 |
|
ref |
參數是按引用傳遞的。方法體內修改參數值會傳導到方法體外用作方法參數的變量的值。但方法體內不強制修改參數值,可以修改也可以不修改。 |
事件
以下代碼定義了一個事件
|
public event EventHandler NameChanged = null; |
在這里“public”定義該事件為公開的;代碼“event”說明這是定義一個事件;代碼“EventHandler”就是事件采用的委托類型;代碼“NameChanged”就是事件的名稱;代碼“=null”設置該事件的初始值為空。
本類型還定義了一個函數來觸發這個事件,該函數的代碼如下
{
if (NameChanged != null)
{
NameChanged(this, null);
}
}
在這里使用代碼“if( NameChanged != null )”用于判斷事件是否有效,而代碼“NameChanged( this , null )”就是調用該事件綁定的方法。
從便于理解的角度上看,事件可以說是一種比較特殊的字段,它是一種列表,能存儲若干個委托對象,從而能動態的綁定了若干個方法。
索引器
索引器允許類或者結構體的實例就像數組一樣進行索引,索引器類似一個帶有參數的屬性。以下代碼定義了一個索引器
/// 索引器的范例
/// </summary>
public class PeopleList
{
public PeopleList()
{
}
private ArrayList _Values = new ArrayList() ;
/// <summary>
/// 添加對象
/// </summary>
/// <param name="people"></param>
public void AddPeople(PeopleClass people)
{
_Values.Add(people);
}
/// <summary>
/// 參數為序號的索引器
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public PeopleClass this[int index]
{
get
{
return ( PeopleClass ) _Values[index];
}
set
{
_Values[index] = value;
}
}
/// <summary>
/// 參數為人員姓名的索引器
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public PeopleClass this[string name]
{
get
{
foreach (PeopleClass people in _Values)
{
if (people.Name == name)
{
return people;
}
}
return null ;
}
}
/// <summary>
/// 根據生日計算年齡
/// </summary>
/// <param name="birthday"></param>
/// <returns></returns>
public static int CalculateAge( DateTime birthday )
{
return DateTime.Now.Subtract(birthday).Days / 365;
}
}
在代碼“public PeopleClass this[int index]”中,“public”說明該索引器是公開的,“PeopleClass”定義了改索引器使用的數據類型,“this[ ]”說明這是在定義一個索引器,“int index”就是說明該索引器有個名為“index”類型為“int”的參數。
在代碼“public PeopleClass this[string name]”中,“string name”說明該索引器使用的是一個字符串類型的參數,這個索引器可以按照人員姓名來獲得人員信息對象。[袁永福版權所有]
在索引器的“get”代碼塊中,程序根據“index”參數值獲得返回值;在“set”代碼塊中,程序根據“index”參數值和默認存在的“value”參數值來設置內部數值。
若索引器只有“get”代碼塊而沒有“set”代碼塊,則該索引器是只讀的,不能通過它來修改數據;若只有“set”代碼塊而無“get”代碼塊,則該索引器只能用于修改數據而不能用于獲得數據。
以下的C#代碼就演示了如何使用索引器,
PeopleList list = new PeopleList();
// 向對象添加內容
list.AddPeople(new PeopleClass("1", "張三"));
list.AddPeople(new PeopleClass("2", "李四"));
list.AddPeople(new PeopleClass("3", "王五"));
list.AddPeople(new PeopleClass("4", "陳六"));
list.AddPeople(new PeopleClass("5", "趙七"));
list.AddPeople(new PeopleClass("6", "錢八"));
// 使用索引器獲得數據
PeopleClass people = list[0];
people = list["趙七"];
從這段代碼中可以看到,帶有索引器的類型的對象實例可以當做數組來使用,可以使用下標來訪問它的數據。[袁永福版權所有]
索引器比數組更為靈活,因為數組只能使用整數作為下標值,而索引器可以使用任何數據類型作為下標值。比如在這里使用代碼“public PeopleClass this[string name]”定義的索引器就可以使用字符串作為下標值。而且索引器可以有多個參數來支持多個下標值。
此外索引器可以被重載,可以定義抽象索引器或虛擬索引器。[袁永福版權所有]
posted on 2011-08-03 16:15 袁永福 電子病歷,醫療信息化 閱讀(630) 評論(0) 收藏 舉報
浙公網安備 33010602011771號