[畢業(yè)生的商業(yè)軟件開發(fā)之路]C#類型成員樣式
靜態(tài)成員
使用關(guān)鍵字“static”修飾的類型成員就是靜態(tài)的,類型的字段、屬性、方法、事件、構(gòu)造函數(shù)都可以是靜態(tài)的。例如在上面的PeopleClass中使用了以下代碼定義了一個靜態(tài)方法。
|
public static int CalculateAge( DateTime birthday ) { return DateTime.Now.Subtract(birthday).Days / 365; } |
這個靜態(tài)方法就是能根據(jù)生日計(jì)算周歲數(shù)的。由于計(jì)算周歲是一個通用的算法,并不局限于某個特定的對象,因此可以將其定義為靜態(tài)類。
靜態(tài)成員類型無需創(chuàng)建對象實(shí)例即可通過“類型名稱.成員名”的方式調(diào)用。比如以下代碼就能調(diào)用CalculateAge方法。
|
DateTime dtm = new DateTime(1980, 2, 14); int age = PeopleClass.CalculateAge(dtm); |
對于靜態(tài)類型,通過“實(shí)例變量.成員名”的方式反而不能調(diào)用,比如以下的代碼是錯誤的。
|
PeopleClass instance = new PeopleClass(); DateTime dtm = new DateTime(1980, 2, 14); int age = instance.CalculateAge(dtm); |
注意調(diào)用靜態(tài)成員C#和VB.NET語法有些差別。在VB.NET中,可以使用“派生的類型名稱.成員名”來調(diào)用靜態(tài)成員,但C#不支持。比如在類型A中定義了靜態(tài)成員M,而從類型A之上派生了類型B,則在VB.NET中可以使用“A.M”或者“B.M”來調(diào)用靜態(tài)成員,但在C#中不能用“B.M”這種寫法。
例如以下代碼中定義了靜態(tài)方法“Sum”和靜態(tài)字段“Value”,
|
public class MyClass { public static int Value = 100 ; public static int Sum(int a, int b) { return a + b; } }
|
這樣我們就可以使用“MyClass.Sum”來調(diào)用這個方法而無需創(chuàng)建對象實(shí)例。若還從這個類型派生了新類型,其代碼如下
|
public class OtherClass : MyClass { } |
則在C#中只能使用“MyClass.Sum”來調(diào)用這個靜態(tài)方法,而在VB.NET中可以有“MyClass.Sum”和“OtherClass.Sum”兩種方式來調(diào)用這個靜態(tài)方法。
靜態(tài)字段
對于靜態(tài)字段,是可以賦值的,而且靜態(tài)字段作用范圍是整個程序,相當(dāng)于全局變量,比如在任意地方修改了此處的靜態(tài)變量“Value”的值后,其他地方獲得的字段值就是修改后的值。
靜態(tài)構(gòu)造函數(shù)
被“static”修飾的無參數(shù)構(gòu)造函數(shù)就是類型的靜態(tài)構(gòu)造函數(shù),例如對于上面的PeopleClass類型中就使用了以下代碼定義了一個靜態(tài)構(gòu)造函數(shù)。
|
static PeopleClass() { System.Console.WriteLine("Start"); } |
在程序加載的時(shí)候,若程序沒有調(diào)用PeopleClass中的成員,靜態(tài)構(gòu)造函數(shù)不會被調(diào)用,甚至使用typeof操作也不會調(diào)用;但程序中第一次引用了類型的某個成員或者創(chuàng)建了對象實(shí)例前,系統(tǒng)會自動的調(diào)用一次類型的靜態(tài)構(gòu)造函數(shù),而且整個軟件運(yùn)行期間,某個類型的靜態(tài)構(gòu)造函數(shù)只可能調(diào)用一次,不會被重復(fù)調(diào)用的。
靜態(tài)構(gòu)造函數(shù)適用于延時(shí)進(jìn)行系統(tǒng)初始化的操作,這能加快系統(tǒng)的啟動速度。
注意,靜態(tài)構(gòu)造函數(shù)必須是沒有參數(shù)的,而且肯定是私有的,不能設(shè)置可訪問級別。
實(shí)例成員
沒有被“static”關(guān)鍵字修飾的類型成員就是實(shí)例成員,比如PeopleClass類型中定義了一個ToString方法,其代碼如下。
|
public override string ToString() { return _Code + " " + _Name; } |
此時(shí)不能用“PeopleClass.ToString”來調(diào)用這個方法,必須首先創(chuàng)建對象實(shí)例,然后調(diào)用這個對象實(shí)例的方法,其演示代碼如下
|
PeopleClass instance = new PeopleClass( ); instance.ToString( ) ; |
虛擬成員
被關(guān)鍵字“virtual”修飾的成員類型是虛擬成員,比如以下代碼就包含了一個名為“Sum”的虛擬函數(shù)。
|
public class MyClass { public virtual int Sum(int a, int b) { return a + b; } } |
其實(shí)虛擬成員并不虛擬,它可以包含實(shí)質(zhì)性的功能代碼,能完成一定的功能。只不過虛擬成員可以方便的被重載而已,繼承者也可以根據(jù)需要不重載這些虛擬方法。
抽象成員
被關(guān)鍵字“abstract”修飾的類型成員就是抽象成員。抽象成員只能是屬性、方法和索引器。以下代碼就定義了一個抽象方法。
|
public abstract int Sum(int a, int b) ; |
在這段代碼中,“public”說明方法是公開的;“abstract”說明這是一個抽象的成員;“int”為方法的返回值類型;“Sum”為方法的名稱;“int a , int b”為方法的參數(shù)列表。
定義抽象類型和定義接口的方法類似,只需要寫出成員的聲明即可,但還需要寫出抽象成員的可訪問性。
抽象成員必須出現(xiàn)在抽象類中,而且在從抽象類派生新類型時(shí),所有的抽象方法必須重寫以填充方法體。
抽象成員和虛擬成員是有區(qū)別的,抽象成員不能定義任何實(shí)質(zhì)的功能,必須被重載;而虛擬成員必須包含完整的代碼結(jié)構(gòu),可以包含實(shí)質(zhì)功能,可以不被重載。[袁永福版權(quán)所有]
常數(shù)成員
被關(guān)鍵字“const”修飾的成員字段為常數(shù)字段,可以使用“類型名稱.字段名”來引用常數(shù)。比如以下代碼就包含了一個常數(shù)
|
public class MyClass { public const double PI = 3.1415926; } |
對此我們可以使用“MyClass.PI”來獲得這個常數(shù)值。常數(shù)值是不能修改的,比如對于賦值代碼“MyClass.PI = 3.14;”就是錯誤的;相對于的,靜態(tài)字段是可以被修改的,比如此處使用代碼“public static double PI = 3.1415926;”來定義這個字段,則就可以對這個字段賦值了。
posted on 2011-08-04 13:40 袁永福 電子病歷,醫(yī)療信息化 閱讀(591) 評論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號