[畢業生的商業軟件開發之路] C#類型2
近期開始接觸到在校學生、高校實習生和畢業生,在此說一下筆者對這些徘徊在職場門口的學生一些建議,希望能給這些初學者進入軟件開發行業帶來一些幫助,使得畢業生能更順利的進入軟件開發公司開始職場生涯,人生來一個完美的轉彎。
-------------------------------------------------------------------------------
可訪問級別
在說明自定義類型是提到了類型以及成員的可訪問級別,在此詳細說明一下。以下是關于可訪問級別的演示代碼,這段代碼保存在本章配套程序的代碼文件“可訪問級別.cs”中。
|
public class 可訪問級別范例 { /// <summary> /// 私有成員 /// </summary> private string _PrivateField = null;
/// <summary> /// 受保護的成員 /// </summary> protected string _ProtectedField = null ;
/// <summary> /// 公開的成員 /// </summary> public string _PublicField = null;
/// <summary> /// 程序集內部成員 /// </summary> internal string _InternalField = null;
public void Test() { this._PrivateField = "能訪問 private 成員"; this._ProtectedField = "能訪問 protected 成員"; this._InternalField = "能訪問 internal 成員"; this._PublicField = "能訪問 public 成員"; } }
public class 測試可訪問級別范例 { public void Test() { 可訪問級別范例 instance = new 可訪問級別范例( ); instance._InternalField = "能訪問 internal 成員"; instance._PublicField = "能訪問 public 成員"; // 不能訪問 _PrivateField , _InternalField , _ProtectedField } }
public class 測試可訪問級別范例2 : 可訪問級別范例 { public void Test2() { this._InternalField = "能訪問 internal 成員"; this._ProtectedField = "能訪問 protected 成員"; this._PublicField = "能訪問 public 成員"; //不能訪問 this._PrivateField // 如果是在另外一個C#項目中定義了派生類則還不能訪問 _InternalField 成員 } } |
private 私有的
使用關鍵字“private”描述的類型或類型成員是私有的,只能在類型內部訪問,超出這個范圍就不能訪問,派生類型也不能訪問基類的私有的成員。例如以下代碼就定義了一個私有變量。
|
private string _PrivateField = null; |
這行代碼中,關鍵字“private”說明這是私有的成員,“string”定義了成員的數據類型,“_PrivateField”為成員的名稱,“=null;”定義了該字段的默認值。
protected 受保護的
使用關鍵字“protected”描述的類型或類型成員是受保護的,只有類型內部或者從其派生的類型可以訪問它,超出這個范圍就不能訪問了。以下代碼就定義了一個收保護的字段。
|
protected string _ProtectedField = null ; |
internal 內部的
使用關鍵字“internal”描述的類型和類型成員是程序集內部的,只能在程序集內部可見,其效果等價于“public”;而在程序集外部不可見,其效果等價于“private”。例如以下代碼就定義了一個內部的字段。
|
internal string _InternalField = null; |
在VS.NET中,由于一個程序集是由C#工程編譯而得,因此程序集內部就等價于C#工程中內部,程序集外部就是引用了該C#工程編譯結果的其他C#工程。
比如當C#工程A中定義了一個internal類型,則在工程A中的任意C#代碼都能訪問這個內部類型;但當C#工程B引用了工程A的編譯結果,則在工程B中的任意C#代碼都不能訪問工程A中定義的內部類型。
public 公開的
使用關鍵字“public”描述的類型或類型成員是公開的,在任何地方都能訪問。以下代碼就定義了一個公開的字段。
|
public string _PublicField = null; |
下表總結了可訪問級別
|
可訪問級別 |
類型內部 |
派生的類型 |
同一個程序集的其他類型 |
不同程序集的其他類型 |
|
public |
可見 |
可見 |
可見 |
可見 |
|
protected |
可見 |
可見 |
非派生的不可見 |
非派生的不可見 |
|
Private |
可見 |
不可見 |
不可見 |
不可見 |
|
internal |
可見 |
同程序集的可見 |
可見 |
不可見 |
類型成員有可訪問級別,而類型本身也有可訪問級別控制,兩者的效果一樣。
當類型和類型成員的可訪問級別不一致時,從類型外部看,對類型成員的可訪問級別是類型的訪問級別和類型成員自身的訪問級別的疊加,取兩者可見范圍的交集。
例如當類型是public類型而某個成員方法是internal類型,則在程序集內部該成員方法到處都可見,但在程序集外部不可見。
類型樣式
在定義類型的時候可以指定類型的一些特性,這些樣式有
static class 靜態類
被“static”修飾的類就是靜態類型,靜態類型其所有的成員都必須標記為靜態的,否則會編譯錯誤。靜態類型一般用于容納一些通用的例程,比如某些科學數值運算等。
以下C#代碼就定義了一個靜態類型
|
public static class MyStaticClass { public static int Sum(int a, int b) { return a + b; } } |
在代碼“public static class MyStaticClass”中,“public”定義類型為公開的,“static”說明該類型是靜態的,“class”說明正在定義一個類類型,“MyStaticClass”是類型名稱。
在這個類型中定義了一個靜態方法Sum,在靜態類型中不能定義非靜態的成員。由于類型的構造函數也是靜態的,因此靜態類型不能實例化。
關于靜態方法可參考下節。
abstract class 抽象類
被“abstract”修飾的類就是抽象類,抽象類是一種介于類和接口之間的類型,定義為抽象類說明其有部分內容尚未實現,有待以后被繼承被擴展。以下代碼就定義了一個抽象類
|
public abstract class MyAbstractClass { public abstract int Sum(int a, int b);
public int Div(int a, int b) { return a / b; } } |
在代碼“public abstract class MyAbstractClass”中,關鍵字“abstract”就聲明了該類型為抽象類;在代碼“public abstract int Sum(int a, int b);”中,關鍵字“abstract”就聲明該成員為抽象成員,抽象成員只能留個定義,不能有任何功能實現代碼,因此在這里聲明一下Sum方法就用分號結束了定義。
抽象類可以包含不抽象的方法,比如此處包含了一個完整的Div成員方法。。
抽象類不能實例化,對于類型“我的抽象類”,代碼“MyAbstractClass instance = new MyAbstractClass( )”是錯誤的,抽象類必須派生出其他類型才能使用;而且派生的時候,所有的抽象成員必須強制被重寫。由于抽象類必須被重載,因此抽象類不能是密封類,也就是說關鍵字“abstract”和“sealed”是相互排斥的。
以下代碼就從抽象類“MyAbstractClass”派生新的類型
|
public class MyClassFromMyAbstractClass : MyAbstractClass { public override int Sum(int a, int b) { return a + b; } } |
由于從抽象類派生新類型時,開發人員可能忘記抽象類中定義的抽象成員,此時VS.NET的C#代碼編輯器提供幫助功能,這個和幫助生成實現接口的功能類型,如下圖所示

當文本光標移動到方框處的“MyAbstractClass”,則左下角出現一個智能標簽,鼠標點擊這個智能標簽會彈出一個菜單,點擊菜單項目“實現抽象類“MyAbstractClass””就會自動生成以下代碼。
|
public class MyClassFromMyAbstractClass : MyAbstractClass { public override int Sum(int a, int b) { throw new NotImplementedException(); } } |
這個時候開發人員就可以往重載的成員中添加功能代碼了。
由于抽象類型不能實例化,因此必須借助它的派生類型才能使用,比如以下的代碼
|
MyAbstractClass instance = new MyClassFromMyAbstractClass(); instance.Div(1, 2); instance.Sum(3, 4); |
當然派生類型可以獨立使用,如以下代碼
|
MyClassFromMyAbstractClass instance2 = new MyClassFromMyAbstractClass(); instance2.Div(1, 2); instance2.Sum(3, 4); |
sealed class 密封類
被關鍵字“sealed”修飾的類是密封類,密封類可以繼承自其它類,但不能被繼承,不能包含虛方法和抽象方法。以下代碼就定義了一個密封類
|
public sealed class MySealedClass { public int Sum(int a, int b) { return a + b; } } |
由于密封類不能被繼承,不能被擴展,這可能會影響系統的擴展性,因此慎用,在實際中用得比較少。
posted on 2011-07-19 09:49 袁永福 電子病歷,醫療信息化 閱讀(750) 評論(1) 收藏 舉報
浙公網安備 33010602011771號