靜態成員
使用關鍵字
static
修飾的類型成員就是靜態的
類型的字段
屬性
方法
事件
構造函數都可以是靜態的
例如在上面的PeopleClass中使用了以下代碼定義了一個靜態方法
publicstaticint CalculateAge( DateTime birthday )
{
returnDateTimeNowSubtract(birthday)Days / ;
}
這個靜態方法就是能根據生日計算周歲數的
由於計算周歲是一個通用的算法
並不局限於某個特定的對象
因此可以將其定義為靜態類
靜態成員類型無需創建對象實例即可通過
類型名稱
成員名
的方式調用
比如以下代碼就能調用CalculateAge方法
DateTime dtm = newDateTime( );
int age = PeopleClassCalculateAge(dtm);
對於靜態類型
通過
實例變量
成員名
的方式反而不能調用
比如以下的代碼是錯誤的
PeopleClass instance = newPeopleClass();
DateTime dtm = newDateTime( );
int age = instanceCalculateAge(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 = ;
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()
{
SystemConsoleWriteLine(Start);
}
在程序加載的時候
若程序沒有調用PeopleClass中的成員
靜態構造函數不會被調用
甚至使用typeof操作也不會調用
但程序中第一次引用了類型的某個成員或者創建了對象實例前
系統會自動的調用一次類型的靜態構造函數
而且整個軟件運行期間
某個類型的靜態構造函數只可能調用一次
不會被重復調用的
靜態構造函數適用於延時進行系統初始化的操作
這能加快系統的啟動速度
注意
靜態構造函數必須是沒有參數的
而且肯定是私有的
不能設置可訪問級別
實例成員
沒有被
static
關鍵字修飾的類型成員就是實例成員
比如PeopleClass類型中定義了一個ToString方法
其代碼如下
publicoverridestring ToString()
{
return _Code + + _Name;
}
此時不能用
PeopleClass
ToString
來調用這個方法
必須首先創建對象實例
然後調用這個對象實例的方法
其演示代碼如下
PeopleClass instance = newPeopleClass( );
instanceToString( ) ;
虛擬成員
被關鍵字
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 = ;
}
對此我們可以使用
MyClass
PI
來獲得這個常數值
常數值是不能修改的
比如對於賦值代碼
MyClass
PI =
;
就是錯誤的
相對於的
靜態字段是可以被修改的
比如此處使用代碼
publicstaticdouble PI =
;
來定義這個字段
則就可以對這個字段賦值了
From:http://tw.wingwit.com/Article/program/net/201311/11840.html