<b>訪問(wèn)修飾符</b>
字段
訪問(wèn)修飾符 類型 標(biāo)識(shí)符;
方法
訪問(wèn)修飾符 返回類型 方法名()
{
、侍瑟、扰肌、
}
<b>五種成員訪問(wèn)控制如下</b>
私有的(private) 私有成員只能從聲明它的類的內(nèi)部訪問(wèn),其他的類不能看見(jiàn)或訪問(wèn)它們氧枣。
公有的(public)
受保護(hù)的(protected)
內(nèi)部的(internal)
受保護(hù)內(nèi)部的(protected internal)
<b>實(shí)例成員</b>:類的每個(gè)實(shí)例都是不同的實(shí)體沐兵,它們有自己的一組數(shù)據(jù)成員,不同于同一類的其他實(shí)例便监,因?yàn)檫@些數(shù)據(jù)成員都和類的實(shí)例相關(guān)扎谎,所以被稱為實(shí)例成員。
<b>靜態(tài)成員</b>:實(shí)例成員是默認(rèn)類型烧董,但也可以聲明與類而不是實(shí)例相關(guān)的成員毁靶,它們被稱為靜態(tài)成員。
<b>方法</b>
本質(zhì)上解藻,方法是一塊具有名稱的代碼老充,可以使用方法的名稱執(zhí)行代碼,也可以把數(shù)據(jù)傳入方法并接收數(shù)據(jù)輸出螟左。
方法是類的函數(shù)成員啡浊,方法有兩個(gè)主要部分觅够,方法頭和方法體
方法頭指定方法的特征,包括:
方法是否返回?cái)?shù)據(jù)巷嚣,如果返回返回什么類型喘先;
方法的名稱;
什么類型的輸入可以傳入方法廷粒。
方法體包含了可執(zhí)行代碼的語(yǔ)句序列窘拯。執(zhí)行從方法體的第一條語(yǔ)句開(kāi)始,一直到方法結(jié)束.
<b>常量</b>
兩個(gè)特征:聲明中必須初始化坝茎;聲明后不能改變涤姊。
常量聲明的語(yǔ)法與變量或字段的聲明相同,除了下面內(nèi)容:
在類型之前增加關(guān)鍵字const嗤放,關(guān)鍵字const不是一個(gè)修飾符思喊,而是核心聲明的一部分,它必須直接放在類型的前面次酌。恨课;
必須有初始化語(yǔ)句。
<b>引用參數(shù)</b>
使用引用參數(shù)是岳服,必須在方法的聲明和調(diào)用中都使用ref修飾符剂公;
實(shí)參必須是變量,在用作實(shí)參前必須被賦值吊宋。如果是引用類型變量纲辽,可以付志偉一個(gè)引用或NULL值。
void MyMethod(ref int val) //方法聲明
{...}
int y=1; //實(shí)參變量
MyMethod(ref y); //方法調(diào)用
MyMethod(ref 2+3) //出錯(cuò)璃搜,val必須使用變量
<b>輸出參數(shù)</b>
輸出參數(shù)用于從方法體內(nèi)把數(shù)據(jù)傳出到調(diào)用代碼文兑,它們非常類似引用參數(shù)。它有如下要求:
<li>必須在聲明的調(diào)用中都使用修飾符腺劣,輸出參數(shù)的修飾符是out而不是ref</li>
<li>實(shí)參必須是變量绿贞,不能是其他表達(dá)式類型。</li>
<b>參數(shù)數(shù)組</b>
重點(diǎn):
<li>在一個(gè)參數(shù)列表中只能有一個(gè)參數(shù)數(shù)組橘原。</li>
<li>如果有籍铁,他必須是列表中的最后一個(gè)</li>
聲明一個(gè)參數(shù)數(shù)組必須要做的事:
<li>在數(shù)據(jù)類型前使用params修飾符</li>
<li>在數(shù)據(jù)類型后放置一組空的方括號(hào)</li>
void ListInts(params int[] inVals)
{....}
<li>數(shù)組是一組整齊的相同類型的數(shù)據(jù)項(xiàng)。</li>
<li>數(shù)組使用一個(gè)數(shù)字索引進(jìn)行訪問(wèn)趾断。</li>
<li>數(shù)組是一個(gè)引用類型拒名,因此它的所有數(shù)據(jù)項(xiàng)都保存在堆中</li>
ListInts(10,20,30): //所有元素必須是方法聲明中指定的類型
int[] intArray={1,2芋酌,3}增显;
ListInts(intArray); //一個(gè)數(shù)組變量
<li>在聲明中需要修飾符</li>
<li>在調(diào)用中不允許有修飾符</li>
參數(shù)類型 | 修飾符 | 是否在聲明時(shí)使用 | 是否在調(diào)用時(shí)使用 | 執(zhí)行 |
---|---|---|---|---|
值 | 無(wú) | 系統(tǒng)把實(shí)參的值復(fù)制到形參 | ||
引用 | ref | 是 | 是 | 形參是實(shí)參的別名 |
輸出 | out | 是 | 是 | 形參是實(shí)參的別名 |
數(shù)組 | params | 是 | 否 | 允許傳遞可變數(shù)目的實(shí)參到方法 |
<b>棧幀</b>
當(dāng)一個(gè)方法被調(diào)用時(shí),在棧頂分配了一塊內(nèi)存用于保存一定數(shù)量與方法相關(guān)的數(shù)據(jù)項(xiàng)脐帝,這塊內(nèi)存叫方法的棧幀同云。
<ul><li>棧幀含有保存下列內(nèi)容的內(nèi)存:</li>
<ol><li>返回地址——就是方法退出時(shí)在哪兒繼續(xù)執(zhí)行</li>
<li>分配內(nèi)存的參數(shù)——就是方法的值參數(shù)糖权,如果有參數(shù)數(shù)組</li>
<li>與方法調(diào)用相關(guān)的其他各種管理數(shù)據(jù)項(xiàng)</li></ol>
<li>方法被調(diào)用時(shí),它的整個(gè)棧幀被壓入棧中炸站。</li>
<li>方法退出時(shí)星澳,它的整個(gè)棧幀被從棧中彈出。彈出一個(gè)棧幀有事也稱為釋放棧</li>
class Program
{
static void MethodA(int par1,int par2)
{
Console.WriteLine("Enter MethodA:{0},{1}",par1,par2);
MethodB(11, 18);
Console.WriteLine("Exit MethodA");
}
static void MethodB(int par1, int par2)
{
Console.WriteLine("Enter MethodB:{0},{1}", par1, par2);
Console.WriteLine("Exit MethodB");
}
static void Main(string[] args)
{
Console.WriteLine("Enter Main");
MethodA(15, 30);
Console.WriteLine("Exit Main");
Console.ReadKey();
}
}
輸出結(jié)果為:
Enter Main
Enter MethodA:15,30
Enter MethodB:11,18
Exit MethodB
Exit MethodA
Exit Main
方法重載
一個(gè)類中可以有一個(gè)以上的方法擁有相同的名稱旱易,這叫做方法重載禁偎,使用相同名稱的每個(gè)方法必須有一個(gè)和其他方法不相同的簽名
- 方法的簽名有下列信息組成,它們?cè)诜椒暶鞯姆椒^中:
- 方法的名稱阀坏;
- 參數(shù)的數(shù)目如暖;
- 參數(shù)的數(shù)據(jù)類型和順序;
- 參數(shù)修飾符忌堂;
- 返回類型不是簽名的一部分装处,而認(rèn)為它是簽名的一部分是一種常見(jiàn)的錯(cuò)誤。
- 形參的名稱也不是簽名的一部分浸船。
例:
class A
{
long Add(int a,int b) {return a+b;}
long Add(int a,int b,int c) {return a+b+c;}
long Add(float a,float b) {return a+b;}
long Add(long a,long b) {return a+b;}
}
類進(jìn)階
實(shí)例類成員
改變一個(gè)實(shí)例的字段拷貝的值不影響其他實(shí)例的拷貝的值
class D
{
public in num1;
}
class Program
{
static void Main()
{
D d1=new D();
D d2=new D();
d1.num1=10;d2.num1=25;
Console.WriteLine("d1={0},d2={1}",d1.num1,d2.num1)
}
}
輸出結(jié)果
d1=10,d2=25
靜態(tài)字段被類的所有實(shí)例共享,所有實(shí)例都訪問(wèn)同意內(nèi)存位置寝蹈,所以李命,如果該內(nèi)存位置的值被一個(gè)實(shí)例改變了,這種改變對(duì)所有的實(shí)例都可見(jiàn)箫老。
class D
{
int num1;
static int num2;
public void SetVars(int v1, int v2)//設(shè)置值
{ num1 = v1; num2 = v2; }
public void DisPlay(string str) //顯示值
{ Console.WriteLine("{0}:num1={1},num2={2}",str,num1,num2); }
}
class Program
{
static void Main()
{
D d1 = new D();
D d2 = new D();//創(chuàng)建兩個(gè)實(shí)例
d1.SetVars(2, 4);//設(shè)置d1的值
d1.DisPlay("d1");
d2.SetVars(22,14);//設(shè)置d2的值
d2.DisPlay("d2");
d1.DisPlay("d1");//再次顯示d1
Console.ReadKey();
}
}
輸出結(jié)果為:
d1:num1=2,num2=4
d2:num1=22,num2=14
d1:num1=2,num2=14
實(shí)例成員在實(shí)例被創(chuàng)建時(shí)開(kāi)始存在封字,當(dāng)實(shí)例被銷毀時(shí)停止存在。然而耍鬓,靜態(tài)成員及時(shí)沒(méi)有類的實(shí)例也存在并可以訪問(wèn)阔籽。
例:
class D
{
int num1;
static public int num2;
}
class Program
{
static void Main()
{
D.num2 = 4;//沒(méi)有實(shí)例化
Console.WriteLine("num2={0}",D.num2);
Console.ReadKey();
}
}
輸出結(jié)果
num2=4
靜態(tài)函數(shù)成員
- 同靜態(tài)字段一樣,靜態(tài)函數(shù)成員獨(dú)立于任何類實(shí)例牲蜀。即使沒(méi)有類的實(shí)例笆制,仍可以調(diào)用靜態(tài)方法。
- 靜態(tài)函數(shù)成員不能訪問(wèn)實(shí)例成員涣达。然而在辆,它們能訪問(wèn)其它靜態(tài)成員。
成員常量
- 聲明在類聲明中度苔;
- 不能再常量成員聲明以后給他賦值匆篓;
- 成員常量對(duì)類的每個(gè)實(shí)例都是可見(jiàn)的,及時(shí)沒(méi)有類的實(shí)例它們也可以使用寇窑;
- 常量在內(nèi)存中沒(méi)有自己的儲(chǔ)存位置鸦概,而是在編譯時(shí)被編譯器替換。(ps:我一直以為是和值類型一樣放在棧中呢( ̄▽ ̄)/)甩骏;
屬性
就像字段窗市,屬性有如下特征:
- 它是命名的類成員先慷;
- 它有類型;
- 他可以被賦值和讀冉魃琛熟掂;
然而和字段不同的是,屬性是一個(gè)函數(shù)成員扎拣。 - 他不為數(shù)據(jù)儲(chǔ)存分配內(nèi)存赴肚;
- 它執(zhí)行代碼;
屬性是指定的一組兩個(gè)匹配的二蓝,稱為訪問(wèn)器的方法 - set訪問(wèn)器用于為屬性賦值誉券;
- get訪問(wèn)器用于從屬性取值。
屬性本身沒(méi)有任何儲(chǔ)存刊愚,訪問(wèn)器決定如何處理發(fā)進(jìn)來(lái)的數(shù)據(jù)踊跟,以及什么數(shù)據(jù)應(yīng)該被發(fā)送出去,屬性使用一個(gè)字段做儲(chǔ)存
set訪問(wèn)器接受他的輸入?yún)?shù)value鸥诽,并把他的值賦值給字段
get訪問(wèn)器只是返回字段的值
使用屬性
寫(xiě)入和讀取屬性的方法與訪問(wèn)字段一樣商玫,訪問(wèn)器被隱式調(diào)用
int MyvAalue //屬性聲明
{
set{...}
get{...}
}
...
MyvAalue=5; //賦值隱式調(diào)用set方法
z=MyvAalue; //表達(dá)式:隱式調(diào)用get方法
屬性和關(guān)聯(lián)字段
只有g(shù)et訪問(wèn)器的屬性稱為只讀屬性。
只有set訪問(wèn)器的屬性稱為只寫(xiě)屬性牡借。
兩個(gè)訪問(wèn)器至少要有一個(gè)必須定義拳昌,否則編譯器會(huì)產(chǎn)生一條錯(cuò)誤信息。
靜態(tài)屬性和
屬性也可以聲明為static钠龙,靜態(tài)屬性的訪問(wèn)器和所有靜態(tài)成員一樣:
- 不能訪問(wèn)類的實(shí)例成員——雖然它們能被實(shí)例成員訪問(wèn)炬藤。
- 存在,不管類是否有實(shí)例碴里;
-
當(dāng)從類的外部訪問(wèn)時(shí)沈矿,必須使用類名引用,而不是實(shí)例名咬腋。
實(shí)例構(gòu)造函數(shù)
實(shí)例構(gòu)造函數(shù)是一個(gè)特殊的方法羹膳,他在類的每個(gè)新實(shí)例創(chuàng)建的時(shí)候執(zhí)行。
- 構(gòu)造函數(shù)用于初始化類實(shí)例的狀態(tài)根竿;
- 如果希望能從類的外部創(chuàng)建類的實(shí)例溜徙,需要聲明構(gòu)造函數(shù)為public;
- 構(gòu)造函數(shù)的名稱和類名相同犀填。
-
構(gòu)造函數(shù)不能有返回值蠢壹。
靜態(tài)構(gòu)造函數(shù)
構(gòu)造函數(shù)也可以聲明為static,通常靜態(tài)構(gòu)造函數(shù)初始化類的靜態(tài)字段
靜態(tài)構(gòu)造函數(shù)在下列方面和實(shí)例構(gòu)造函數(shù)不同:
- 靜態(tài)構(gòu)造函數(shù)聲明中使用static關(guān)鍵字。
- 類智能有一個(gè)靜態(tài)構(gòu)造函數(shù)九巡,而且不能帶有參數(shù)图贸。
- 靜態(tài)構(gòu)造函數(shù)不能有訪問(wèn)修飾符。
class Class1()
{
static Class1()
{
... //靜態(tài)構(gòu)造函數(shù)的函數(shù)體
}
...
}
類既可以有靜態(tài)構(gòu)造函數(shù)也可以有實(shí)例構(gòu)造函數(shù)。
靜態(tài)構(gòu)造函數(shù)示例:
class RandomNumber
{
private static Random RandomKey;//私有靜態(tài)字段
static RandomNumber()//靜態(tài)構(gòu)造函數(shù)
{
RandomKey = new Random();//初始化
}
public int GetRandomNumber()
{
return RandomKey.Next();
}
}
class Program
{
static void Main()
{
RandomNumber a = new RandomNumber();
RandomNumber b = new RandomNumber();
Console.WriteLine(a.GetRandomNumber());
Console.WriteLine(b.GetRandomNumber());
Console.ReadKey();
}
}
輸出結(jié)果為:
728118870
1501976979
析構(gòu)函數(shù)
- 每個(gè)類只能有一個(gè)西溝函數(shù)疏日;
- 析構(gòu)函數(shù)不能帶參數(shù)偿洁;
- 析構(gòu)函數(shù)不能帶訪問(wèn)修飾符;
- 析構(gòu)函數(shù)和類有相同的名稱沟优,但以一個(gè)“~”字符做前綴涕滋;
- 析構(gòu)函數(shù)只能對(duì)類的實(shí)例起作用,因此沒(méi)有靜態(tài)析構(gòu)函數(shù)挠阁;
- 不能在代碼中顯示的調(diào)用析構(gòu)函數(shù)宾肺,相反,他在垃圾收集過(guò)程中調(diào)用侵俗,當(dāng)成垃圾收集器分型代碼锨用,并確定在代碼中沒(méi)有任何途徑引用該對(duì)象。
例:
Class1
{
~Class1()
{
cleanuoCode;
}
...
}
- 如果不需要就不要執(zhí)行析構(gòu)函數(shù)隘谣,它們會(huì)帶來(lái)性能上的開(kāi)銷增拥。
- 西溝函數(shù)直營(yíng)釋放對(duì)象自己的外部資源,他不應(yīng)該訪問(wèn)其它的對(duì)象寻歧,應(yīng)為無(wú)法假定這些對(duì)象還有沒(méi)有被收集掌栅。
析構(gòu)函數(shù)本質(zhì)上是Dispose代碼的子集。
redonly修飾符
字段可以用redonly修飾符聲明码泛,其作用類似于聲明一個(gè)字段為const猾封,一但值被設(shè)定就不能改變
this關(guān)鍵字
this關(guān)鍵字在類中使用,是對(duì)當(dāng)前實(shí)例的引用弟晚。它只能被用在下列類成員的代碼塊中:
- 實(shí)例構(gòu)造函數(shù);
- 實(shí)例方法;
- 屬性和索引的實(shí)例訪問(wèn)器
this被用于下列目的: - 用于區(qū)分類的成員和本地變量,或參數(shù)逾苫。
- 作為調(diào)用方法的實(shí)參卿城。
索引
索引是一組get和set訪問(wèn)器,類似于屬性的訪問(wèn)器铅搓。
string this [int index]
{
set{SetAccessorCode}
get{GetAccessorCode}
}