例如車子有欄位:顏色、車門數量; 例如車子有方法:發動引擎、加速、刹車; 範例: class 類別 { public string 欄位; public void 方法( ) { } }. C#中將類別成員分 ...
[C#,CSharp]類別成員
類別成員的種類
類別的成員可以大概分成方法(method)和欄位(Field)
例如車子有欄位:顏色、車門數量
例如車子有方法:發動引擎、加速、刹車
class類別
{
publicstring欄位;
publicvoid方法(){}
}
C#中將類別成員分為10種
類別成員
說 明
範例
常數(Const)與類別相關,且不可更改的常數值
const型別常數;
欄位(Field)類別的變數,實體化後代表物件的狀態
型別欄位;
方法(Method)類別可執行的動作,實體化後代表物件的行為
回傳型別方法(){XXX}
屬性(Property)有取得(get)及設定(set)的欄位
型別欄位;
型別屬性
{
get{return欄位;}
set{this.欄位=value;}
}
索引子(Indexer)使類別具有像陣列的索引功能
型別[]陣列=new型別[大小];
public型別this[inti]
{
get{return陣列[i];}
set{陣列[i]=value;}
}
事件(Event)使類別可以在指定的事情發生時進行對應的處理
intcount;
void事件處理方法(objectsender,EventArgse)
{
count++;
}
void事件設定()
{
List列表=newList();
列表.Changed+=newEventHandler(事件處理方法);
}
運算子(Operator)讓類別支援特定運算子,以便進行運算
publicstatic類別operator+(類別左值,類別右值)
{
類別物件=new物件();
物件.欄位=左值.欄位+右值.欄位;
return物件;
}
建構函式(Constructor)類別實體化成物件時,進行初始化的操作
public類別(){XXX}
解構函式(Destructor)類別實體化成物件後,物件不再被使用時,對佔用的資源做釋放
~類別(){XXX}
型別(InnerClass)巢狀類別
class型別{XXX}
class類別
{
const型別常數;//常數
型別欄位;//欄位
回傳型別方法(){XXX}//方法
型別屬性//屬性
{
get{return欄位;}
set{this.欄位=value;}
}
型別[]陣列=new型別[大小];//索引子
public型別this[inti]
{
get{return陣列[i];}
set{陣列[i]=value;}
}
intcount;//事件
void事件處理方法(objectsender,EventArgse){count++;}
void事件設定()
{
List列表=newList();
列表.Changed+=newEventHandler(事件處理方法);
}
publicstatic類別operator+(類別左值,類別右值)//運算子
{
類別物件=new物件();
物件.欄位=左值.欄位+右值.欄位;
return物件;
}
public類別(){XXX}//建構函式
~類別(){XXX}//解構函式
class型別{XXX}//型別
}
Δ回到最上方
簽章(Signature)
簽章(Signature):編譯器用來識別程式的識別字之基準
即使方法的名稱相同,只要其簽章在類別、結構和介面中是唯一的,都可通過編譯
簽章讓類別、結構和介面的方法(method)可以多載
相同名稱的函式,參數也相同簽章相同
相同名稱的函式,參數不相同簽章不同
類別的簽章:
命名空間
類別名稱
方法的簽章:
方法名稱
型別參數的數目
參數的型別和類型
ref及out參數修飾詞屬於簽章的一部份
方法簽章不包含回傳型別、參數名稱、存取修飾詞
publicvoid方法();//X簽章相同
privatevoid方法();//X簽章相同
publicvoid方法(inta,intb);//O簽章不同
publicvoid方法(inta,intb,intc);//O簽章不同
privatevoid方法(stringa,stringb);//O簽章不同
Δ回到最上方
實體成員
實體欄位、實體方法:如果方法或欄位為物件各別所有,就叫實體欄位或實體方法
同一個類別實體化形成的物件,每個物件都擁有各自的實體欄位
類別一定要實體化成物件,才可對實體欄位、實體方法進行操作
例如有一張房子的設計圖,實際蓋成房子時,一棟可能漆成紅色,另一棟可能漆成藍色,所以"房子牆面的顏色"就是實體欄位
class類別
{
string實體欄位;
publicvoid實體方法(){}
}
Δ回到最上方
類別成員(靜態成員)
類別欄位、類別方法:如果方法或欄位為類別共有的,就叫類別欄位或類別方法
類別欄位也叫做類別變數(ClassVariable)或靜態變數(StaticVariable)
同一個類別的類別欄位、類別方法是共用的,不會因實體不同而有不同
C#中,類別不需要實體化成物件,即可使用類別欄位、類別方法
因為不需實體,所以類別方法中不可以使用實體欄位及方法
在C#中,類別欄位或方法需加上static關鍵字來區分
例如Honda出了CRV系列車款,假設"這款車都是使用鋁圈",設計CRV類別時就可將"鋁圈"宣告為類別欄位
class類別
{
staticint類別欄位;
publicstaticvoid類別方法(){}
}
實體欄位、實體方法、類別欄位、類別方法:
class類別
{
staticint類別欄位;
string實體欄位;
publicstaticvoid類別方法(){
}
publicvoid方法(){
}
}
Δ回到最上方
成員存取運算子
要存取物件的方法或欄位時,要使用.運算子
物件.欄位;
物件.方法();
class類別A
{
publicstring欄位;
publicvoid方法(){}
}
class類別B
{
類別A物件A=new類別A();
物件A.欄位="";//使用.運算子設定欄位值
物件A.方法();//使用.運算子執行方法
}
Δ回到最上方
類別成員的存取範圍
C#的類別成員存取範圍可以分為5類:
範圍
存取修飾詞
說 明
可修飾對象
最大public沒有限制類別、列舉、結構、介面、建構函式、方法、欄位、屬性
次大protected類別內部,或類別的子類別及其衍生類別(子、子孫、...類別)列舉、結構、介面、建構函式、方法、欄位、屬性
小internal目前類別所屬的組件範圍內(dll),即類別所屬的程式內皆可存取,其它程式則不允許列舉、結構、介面、建構函式、方法、欄位、屬性
次小protectedinternal目前類別所屬的組件範圍內(dll),及其衍生類別(子、子孫、...類別)列舉、結構、介面、建構函式、方法、欄位、屬性
最小private只有目前類別內部可以存取列舉、結構、介面、建構函式、方法、欄位、屬性
如果類別成員宣告時沒有指定存取修飾詞,則相當於private
class類別
{
string私有欄位;
}
私有的類別成員只有類別自己內部可以使用,而公開的成員則是別的類別也可以對其進行操作
例如一台電視,其內部的IC和映像管就是private,只有它自己可以使用,而電視外面的開關或按鈕則是public,可以讓使用者操控電視
class類別A
{
privatestring私有欄位;
publicstring公開欄位;
privatestring私有方法()
{
return"Hello";
}
publicstring公開方法()
{
string私有方法的回傳值=私有方法();
公開欄位=私有方法的回傳值;
return私有欄位;
}
}
class類別B
{
publicvoid方法()
{
類別A物件A=new類別A();
物件A.公開欄位="World";
物件A.公開方法();
}
}
readonly關鍵字
readonly關鍵字只能用來修飾欄位,使欄位具有唯讀的特性
用readonly宣告的欄位,只能在宣告時或該類別的建構函式內指派其值
class類別
{
readonlypublicstring唯讀欄位1="A";
publicreadonlystring唯讀欄位2=唯讀欄位1+"B";
publicstaticreadonlystring唯讀欄位3=唯讀欄位1+"BC";
public類別()
{
唯讀欄位1="C";
唯讀欄位2="D";
}
}
class類別
{
readonlypublicstring唯讀欄位="A";
publicstaticreadonlystring靜態唯讀欄位=唯讀欄位1+"B";
publicvoid方法()
{
唯讀欄位="C";//X唯讀欄位只能在宣告時或建構函式指派其值
}
public類別()
{
靜態唯讀欄位="D";//X 靜態唯讀欄位只能在宣告時或靜態建構函式指派其值
}
}
const、readonly、staticconst、staticreadonly比較
項目constreadonlystaticreadonly
預設即為靜態是不是是
宣告時指派值可可可
一般建構函式指派值不可可不可
靜態建構函式指派值可不可可
靜態建構函式指派值可不可可
參考型別的值string及null皆可可
宣告時指派為其它實體欄位的值不可可可
宣告時指派為其它類別欄位的值不可可可
值的設定時機編譯時執行時執行時
Δ回到最上方
Copyright©YehYeh.Allrightsreserved.