靜態成員
使用關鍵字“static”修飾的類型成員就是靜態的,類型的字段、屬性、方法、事件、構造函數都可以是靜態的。例如在上面的PeopleClass中使用了以下代碼定義了一個靜態方法。
publicstaticint CalculateAge( DateTime birthday ) { returnDateTime.Now.Subtract(birthday).Days / 365; }
這個靜態方法就是能根據生日計算周歲數的。由於計算周歲是一個通用的算法,並不局限於某個特定的對象,因此可以將其定義為靜態類。
靜態成員類型無需創建對象實例即可通過“類型名稱.成員名”的方式調用。比如以下代碼就能調用CalculateAge方法。
DateTime dtm = newDateTime(1980, 2, 14); int age = PeopleClass.CalculateAge(dtm);
對於靜態類型,通過“實例變量.成員名”的方式反而不能調用,比如以下的代碼是錯誤的。
PeopleClass instance = newPeopleClass(); DateTime dtm = newDateTime(1980, 2, 14); int age = instance.CalculateAge(dtm);
注意調用靜態成員C#和VB.NET語法有些差別。在VB.NET中,可以使用“派生的類型名稱.成員名”來調用靜態成員,但C#不支持。比如在類型A中定義了靜態成員M,而從類型A之上派生了類型B,則在VB.NET中可以使用“A.M”或者“B.M”來調用靜態成員,但在C#中不能用“B.M”這種寫法。
例如以下代碼中定義了靜態方法“Sum”和靜態字段“Value”,
publicclassMyClass { public static int Value = 100 ; publicstaticint Sum(int a, int b) { return a + b; } }
這樣我們就可以使用“MyClass.Sum”來調用這個方法而無需創建對象實例。若還從這個類型派生了新類型,其代碼如下
publicclassOtherClass : MyClass { }
則在C#中只能使用“MyClass.Sum”來調用這個靜態方法,而在VB.NET中可以有“MyClass.Sum”和“OtherClass.Sum”兩種方式來調用這個靜態方法。
靜態字段
對於靜態字段,是可以賦值的,而且靜態字段作用范圍是整個程序,相當於全局變量,比如在任意地方修改了此處的靜態變量“Value”的值後,其他地方獲得的字段值就是修改後的值。
靜態構造函數
被“static”修飾的無參數構造函數就是類型的靜態構造函數,例如對於上面的PeopleClass類型中就使用了以下代碼定義了一個靜態構造函數。
static PeopleClass() { System.Console.WriteLine("Start"); }
在程序加載的時候,若程序沒有調用PeopleClass中的成員,靜態構造函數不會被調用,甚至使用typeof操作也不會調用;但程序中第一次引用了類型的某個成員或者創建了對象實例前,系統會自動的調用一次類型的靜態構造函數,而且整個軟件運行期間,某個類型的靜態構造函數只可能調用一次,不會被重復調用的。
靜態構造函數適用於延時進行系統初始化的操作,這能加快系統的啟動速度。
注意,靜態構造函數必須是沒有參數的,而且肯定是私有的,不能設置可訪問級別。
實例成員
沒有被“static”關鍵字修飾的類型成員就是實例成員,比如PeopleClass類型中定義了一個ToString方法,其代碼如下。
publicoverridestring ToString() { return _Code + " " + _Name; }
此時不能用“PeopleClass.ToString”來調用這個方法,必須首先創建對象實例,然後調用這個對象實例的方法,其演示代碼如下
PeopleClass instance = newPeopleClass( ); instance.ToString( ) ;
虛擬成員
被關鍵字“virtual”修飾的成員類型是虛擬成員,比如以下代碼就包含了一個名為“Sum”的虛擬函數。
publicclassMyClass { public virtual int Sum(int a, int b) { return a + b; } }
其實虛擬成員並不虛擬,它可以包含實質性的功能代碼,能完成一定的功能。只不過虛擬成員可以方便的被重載而已,繼承者也可以根據需要不重載這些虛擬方法。
抽象成員
被關鍵字“abstract”修飾的類型成員就是抽象成員。抽象成員只能是屬性、方法和索引器。以下代碼就定義了一個抽象方法。
publicabstractint Sum(int a, int b) ;
在這段代碼中,“public”說明方法是公開的;“abstract”說明這是一個抽象的成員;“int”為方法的返回值類型;“Sum”為方法的名稱;“int a , int b”為方法的參數列表。
定義抽象類型和定義接口的方法類似,只需要寫出成員的聲明即可,但還需要寫出抽象成員的可訪問性。
抽象成員必須出現在抽象類中,而且在從抽象類派生新類型時,所有的抽象方法必須重寫以填充方法體。[袁永福版權所有]
抽象成員和虛擬成員是有區別的,抽象成員不能定義任何實質的功能,必須被重載;而虛擬成員必須包含完整的代碼結構,可以包含實質功能,可以不被重載。
常數成員
被關鍵字“const”修飾的成員字段為常數字段,可以使用“類型名稱.字段名”來引用常數。比如以下代碼就包含了一個常數
publicclassMyClass { publicconstdouble PI = 3.1415926; }
對此我們可以使用“MyClass.PI”來獲得這個常數值。常數值是不能修改的,比如對於賦值代碼“MyClass.PI = 3.14;”就是錯誤的;相對於的,靜態字段是可以被修改的,比如此處使用代碼“publicstaticdouble PI = 3.1415926;”來定義這個字段,則就可以對這個字段賦值了。