It計算機(jī)課件 C#課程講義_第1頁
It計算機(jī)課件 C#課程講義_第2頁
It計算機(jī)課件 C#課程講義_第3頁
It計算機(jī)課件 C#課程講義_第4頁
It計算機(jī)課件 C#課程講義_第5頁
已閱讀5頁,還剩63頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

C#課程講義

——杜浦(2005年)

基礎(chǔ)知識

C#所屬的.NetFramework是微軟件為開發(fā)應(yīng)用程序并管理其運行時執(zhí)行而創(chuàng)建的一個

革命性的新平臺。除了開發(fā)工具——如嶄新的C#語言和原有語言的最新版本(包括Visual

Basic、C++和Jscript).NETFramework還有兩個主要組成部分:一個稱為公共語言運

行時(CLR)的運行時環(huán)境(CLR在很多功能上類似于Java虛擬機(jī)),和一個提供在Windows

平臺上開發(fā)Windows應(yīng)用程序所需的幾乎所有常見功能的很大的類庫。需要強(qiáng)調(diào)的一點是,。

NETFramework本身不是一個操作系統(tǒng),但它以操作系統(tǒng)為基礎(chǔ)。現(xiàn)在,.NET惟?實現(xiàn)是

基于Windows系統(tǒng)的,但其他實現(xiàn)(優(yōu)其是基于Linux的)已經(jīng)在開發(fā)過程中。在這些實

現(xiàn)中也將包括C#編譯器。

.NETFramework有各種版本。要運行.NET應(yīng)用程序,宿主計算機(jī)必須安裝.NET。對于

客戶端,如Windows應(yīng)用程序,需要安裝Framework的一個可再發(fā)布的精簡版本,以保證

客戶端能夠運行該程序。這個版本的.NET可以安裝在Windows9x/ME機(jī)器上,并能利用任

何文本編輯器編寫和編譯C#程序,而正規(guī)的開發(fā)工作要求安裝完全版本的.NET軟件開發(fā)工

具包(SDK),這個版本的.NET可以在WindowsNT*2000或XP上運行。

最后,專業(yè)的開發(fā)工作還要求有一個具備高度代碼、智能感知和自動完成等功能的集成

開發(fā)環(huán)境(IDE)oC#開發(fā)的標(biāo)準(zhǔn)IDE是VisualStudio.NET(VS.NET),它是為編寫.NET應(yīng)用

程序?qū)iT設(shè)計的,能為Windows應(yīng)用程序和Windows服務(wù)這樣的工程生成許多標(biāo)準(zhǔn)的基礎(chǔ)

代碼。

公共語言運行時

是.NETFramework的真正核心。CLR管理代碼在運行時的執(zhí)行。C#編譯器不是把程序

編譯為本機(jī)代碼,而是編譯為一種稱為中間語言(IL)的低級語言。在運行時,IL代碼使

用一個JIT編譯器把中間語言編譯為本機(jī)代碼。JIT編譯器允許根據(jù)使用的操作系統(tǒng)和硬件

進(jìn)行代碼優(yōu)化,因此在很大程序上抵消了編譯的性能成本。

CLR托管代碼的一個主要的好處是垃圾收集。在以前的編程語言中,是由開發(fā)人員負(fù)

責(zé)釋放程序使用的所有資源,如果資源使用完后沒有被釋放,會造成許多細(xì)微的難以覺察的

bug?因為系統(tǒng)沒有辦法收回這些資源占用的內(nèi)存,應(yīng)用程序的性能就會逐漸降低。現(xiàn)在,

開發(fā)人員只需負(fù)責(zé)釋放非托管的資源并盡快釋放昂貴的資源,.NET垃圾收集器負(fù)責(zé)銷毀無

用的托管對象,并釋放它們占用的內(nèi)存。

通用類型系統(tǒng)

.NET規(guī)范了方法調(diào)用的方式,并為所有的語言提供了相同的類型。我們甚至可以在一

種.NET語言中繼承用另一種.NET語言編寫的基類。這就意味著C#程序員和VB.net程序可

以合作開發(fā)同一個項目。

程序集

.NET代碼被部署為一種稱為程序集(assembly)的邏輯單元。程序集可以是一個類庫

(DLL),一個控制臺程序或Windows應(yīng)用程序,--^Windows服務(wù),甚至是,?個ASP.NET

頁。程序集可以包括一個或多個物理文件。

程序集不需要特殊的安裝過程——只把文件拷貝到目標(biāo)機(jī)器在上就可以了。不存在一個

中央注冊表,用來存放關(guān)于.NET所有組成部分的信息。因為程序不需要注冊和根本一個惟

一的ProgID,在一臺機(jī)器上可以安裝一個組件的多個版本(并行版本化)。

COM互操作性

,NET的所有這些功能都可以讓開發(fā)工作更加輕松,但還有一個潛在的問題一一因

為.NET幾乎在每個方面都是全新的,無法很容易地把托管.NET代碼和遺留的COM代碼混

合在?起。微軟的解決辦法是提供工作為.NET程序集生成COM類型庫,讀取COM類型庫

并用它們生成.NET包裝器。

Framework類庫

.NET最大的優(yōu)點之一是它提供的數(shù)量龐大的類庫。這些類庫繼承了大部分的Windows

API函數(shù)的功能,還提供了許多更高級別的操作,如:

Windows窗體

Web窗體

ADO.net

Remoting

數(shù)據(jù)訪問、XML串行化和字符串與集合的處理等

VS.NET的安裝

i.運行環(huán)境

CPU:PIII600以上

內(nèi)存:128M以上

硬盤空間:2G

開發(fā)環(huán)境:WINDOWS2003/WINDOWSXP/WINDOWS2000+SP3

運行環(huán)境:任何WINDOWS操作系統(tǒng)

2.安裝前的準(zhǔn)備

刪除系統(tǒng)中原有的所有測試版VisualS組件

刪除VisualStudioAnalyzer6.0

安裝IE6.0

安裝,netFrameWork1.1

安裝FRONTPAGE2000WEB客戶端擴(kuò)展

VS.net的設(shè)計界面

b)菜單/工具欄

C)窗體設(shè)計器

d)控件欄

e)屬性欄

f)代碼編輯器

C#語法

編譯和程序結(jié)構(gòu)

基本的C#語法

□冒號:指明繼承/接口等

□分號:指明一條代碼語的結(jié)束

□花括號:包括代碼塊/作用域分隔符/數(shù)組初始化

□方括號:數(shù)組聲明/訪問數(shù)組元素

□圓括號:調(diào)用承數(shù)/強(qiáng)制類型轉(zhuǎn)換/定義表達(dá)式運算順序

注釋:

1.//-單行注釋

2./**/—多行注釋

3.///-XML文樓注釋,這種類型的注釋可由編譯器處理,并放置在XML文件。

Ctel.bt

Main。函數(shù)

每個程序都需要一個入口點,即程序開始招待的地方。在C#中,入口點是Main方法。

每個C#應(yīng)用程序至少定義一個Main方法。定義多個Main方法也是可以的,但在編譯時必

須選擇哪個Main方法作為入口點。

因為Main方法在創(chuàng)建任何類或結(jié)構(gòu)的實例前被調(diào)用,因此它必須聲明為static(靜態(tài))。

Main方法有幾種可以接受的方法簽名:

publicstaticvoidMain()

publicstaticintMain()

publicstaticvoidMain()string[]args)

publicstaticintMain(string[]args)

最后兩種形式用來向Main()方法傳遞命令行參數(shù)——任何參數(shù)都被作為string類型的數(shù)

據(jù)傳遞。方法的返回值必須是void或int類型。后者反映了C語言中使用返回值表示程序

結(jié)束方式的約定。返回值為0表示程序正常退出,非0的返回值表明程序出現(xiàn)了錯誤。

命名空間

命名空間是C#、接口、委托、枚舉和其他類型的一個邏輯上的組合。便如,需要使用

正則表達(dá)式時,可以在System.Text.RegularExpressions命令空間中查找和它相關(guān)的類型。命

名空間還用來防止類型之間的命名沖突。如果要在應(yīng)用程序中使用一個庫,而該庫中定義的

一個類型和已經(jīng)定義的一個類型同名,就會產(chǎn)生問題。但是,如果庫中定義的類型包含在獨

立的命名空間中,就不會有這樣的問題了。

.NETFramework類庫本身就被組織為--系列的命名空間。開發(fā)自己的C#代碼時,可以

把代碼放在一個自己的命名空間中——如果您沒有定義自己的命名空間,代碼會自動放入一

個沒有名稱的全局命名空間中。要創(chuàng)建命名空間,只需使用namespace關(guān)鍵字定義一個代碼

塊,如下例所示。

命名空間可以嵌套。它不必是連續(xù)的代碼,這一點和類不同。命名空間的各個元素可以

放在不同的源文件中,一個源文件可以包含幾個命名空間。一個命名空間中,每個類型定

義必須是惟一的,不能包括兩個同名的類。可以隨意命名命名空間,行業(yè)約定為:

□命名空間的名稱中每個單詞的第一個字母應(yīng)該大寫

□命名空間的名稱的第一部分通常是一個公司或組織的名稱

□命名空間名稱的第二部分應(yīng)該是相關(guān)技術(shù)的名稱,后面跟可選的特性和設(shè)計名

NamespaceAnimals

namespaceBirds

publicclassSparrow

{

//CodelistingforSparrowclass

訪問包含在命名空間中的?個類型的方法是使用該類型的全名,包括它所在的命名空間

的名稱。使用類型的全名非常麻煩,C#提供了using關(guān)鍵字,它和Java中的import語句相

似。

C#類型系統(tǒng)

通用類型系統(tǒng)(CTS)是定義C#和.NETFramework中的?組預(yù)定義類型,以及所有類

型行為的一個規(guī)范。它定義一個聲明、使用和管理類型的標(biāo)準(zhǔn)化框架,因而促進(jìn)了用不同編

程語言編寫的類型之間的集成。用各種語言寫的類型必須遵循它定義的基本規(guī)則,以保證類

型安全和性能的優(yōu)化。

不是所有的.NET語言都支持在CTS中定義的所有類型,因此任何類只要其成員中有不

受支持的類型,那么該類就可能無法從某些語言中訪問。

CTS區(qū)分兩種基本類型——值類型和引用類型。這兩種類型之間的根本區(qū)別在于它們

在內(nèi)存中存儲的方式。.NET使用兩種不同的物理內(nèi)存來存儲數(shù)據(jù)——棧和托管堆。

值類型總是在內(nèi)存中占用一個預(yù)定義的字節(jié)數(shù)(例如,int類型占用4個字節(jié),而stimg

類型占用的字節(jié)數(shù)會根據(jù)字符串的長度不同而不同),當(dāng)聲明一個值類型變量時,會在棧中

分配適當(dāng)大小的內(nèi)存(除了引用類型的值類型成員外,如類的int字段),內(nèi)存中的這個空

間用來存儲變量所含的值。

引用變量也利用棧,但這時棧包含的只是對另個內(nèi)存位置的引用,而不是實際值。對

象的實際數(shù)據(jù)放在另一個內(nèi)存堆中。為了在不使用在堆中的分配的內(nèi)存時將它釋放,.NET

定期執(zhí)行垃圾收集,對引用不再有效的對象使用的內(nèi)存進(jìn)行回收。

值類型

值類型代表基本數(shù)據(jù)類型,如整型或浮點型。值類型分為三種:枚舉、內(nèi)建值類型、,

用戶定義的值類型(結(jié)構(gòu))

內(nèi)建值類型

結(jié)構(gòu)名稱C#別名說明聯(lián)歡會范圍

Booleanbool布爾值true或false

Bytebyte8位無符號整數(shù)0至1」255

Charchar16位Unicode字符

Decimaldecimal128位高精度

Doubledouble64位雙精度浮點數(shù)

Int16short16位有符號整數(shù)-32768?32767

Int32int32位有符號整數(shù)

Int64long64位有符號整數(shù)

Sbytesbyte8位有符號整數(shù)

Singlefloat32位單精度浮點數(shù)

UIntl6ushort16位無符號整數(shù)

UInt32unit32位無符號整數(shù)

UInt64ulong64位無符號整數(shù)

IntPtr大小取決于平臺的有符號整數(shù)(32位系統(tǒng)/64位系統(tǒng))

UintPtr取決于平臺的無符號整數(shù)

TypedReferace指向內(nèi)存中存儲數(shù)據(jù)位置的指針,和存儲在該位置的數(shù)據(jù)類型的

表示

平臺特定的整數(shù)(IntPtr/UintPtr)用于本機(jī)資源,如窗口句柄等。資源大小取決于使用

的硬件和操作系統(tǒng),但其大小部總是足以包含系統(tǒng)的指針。IntPtr與CLS兼容,而無符號整

數(shù)不孌容。

聲明一個內(nèi)建值類型的變量

C#是強(qiáng)類型化的語言——聲明變量明必須指定其類型。有兩種辦法可以聲明一個內(nèi)建

值類型的變量。可以使用結(jié)構(gòu)的全名或別名。

System.Int32width;

同于

Intwidth;

可以在聲明一個值類型時將它初始化,方法是在變量聲明語句中賦一個值:

intheight=4;

字面量值(常數(shù))

整型字面量默認(rèn)為可以存放值的最小類型,依次為int/unit/long/ulong

浮點型字面量默認(rèn)為double

如果希望把字面量標(biāo)記為默認(rèn)類型以外的數(shù)據(jù)類型,可以在字面量后面加一后綴,顯式

指定它的類型。

類型后綴

unitu

long1

ulongul

floatf

decimalm

例如:floatamount=23.7F;

char的轉(zhuǎn)義字符

轉(zhuǎn)義字符說明

\'單引號

\"雙引號

\\反斜杠

\0空值

\a警告

\b退格

\f換頁

\n換行

\r回車

\t制表符

\v垂宜制表符

引用類型

引用類型包含一個指針,指向堆中存儲對象本身的位置。因為引用類型只包含引用,不

包含實際的值,對方法體內(nèi)參數(shù)所做的任何修改都將影響傳遞給方法調(diào)用的引用類型的變

量。因此,在某些方面和引用參數(shù)相似。

引用類型包括指針、接口和自描述類型。自描述的引用類型包括類的類型和數(shù)組。數(shù)組

代表一組元素,這些元素可以是值類型或引用類型。即使元素是值類型,數(shù)組也中引用類型。

有兩種引用類型在C#受到了特別重視:

第一種是Object類(別名:object)。這是所有值類型和引用類型的最終基類。因為所

有的.NET類型都派生自O(shè)bject類,所以從Object繼承是自然的,不必聲明

另一種是String類。字符串代表一個固定不變的Unicode字符序列。這種不變性意味著,

一旦在堆中分配了一個字符串,它的值將永遠(yuǎn)不會改變。如果值改變了,.NET就創(chuàng)建一個

全新的String對象,并把它賦值給該變量。這意味著,字符串在很多文獻(xiàn)都像值類型,而不

像引用類型。如果把一個字符串傳遞給方法,然后在方法體內(nèi)改變參數(shù)的值,這不會影響最

初的字符串。C#提供了別名string來代表System.String類。

下面三個表達(dá)式都是創(chuàng)建string類型變量的正確方法:

stringstrA=newstring,A',5);

stringstrB="Zachary”;

stringstrC=@"Thislinecanwrap,andcancontainbackslashes(\),etc.^^;

兩個字符串可以使用+運算符達(dá)到連接的H的。

提取string中給定位置上的字符可以使用索引器語法:

stringstr="ByeBye”;

charfirstChar=str[O];

確定類型

確定變量類型有兩種方法。可以使用在Object類中定義的GetType。方法,返回一個Type

對象。另一種方法是使用typeof運算符做同樣的事件。Typeof運算符的參數(shù)是類型的完全

限定名稱,或者是類型的別名。

Obj.GetType()

Typeof(string)

強(qiáng)制類型轉(zhuǎn)換

因為收縮轉(zhuǎn)換會導(dǎo)致丟失數(shù)據(jù),在轉(zhuǎn)換前我們要檢查實際值是否可以存放在int型變量

中。另一個辦法是使用checked運算符,如果轉(zhuǎn)換時丟失數(shù)據(jù)將拋出?個錯誤。

可以隱式轉(zhuǎn)換的數(shù)據(jù)類型如下表:

原始類型轉(zhuǎn)換為

bytedecimal,double,float,int,long,short,unit,ulong,ushort

chardecimal,double,float,int,long,unit,ulong,ushort

floatdouble

intdecimal,double,float,long

longdecimal,double,float

sbytedecimal,double,float,int,long,short

shortdecimal,double,float,int,long

unitdecimal,double,float,long,ulong

ulongdecimal,double,float

ushortdecimal,double,float,int,long,unit,ulong

裝箱和拆箱

值類型和引用類型都是從Object類派生來的,這意味著任何?個值類型都可以調(diào)用一

個Object類方法:

值類型變量被隱式轉(zhuǎn)換為引用類型時,稱之為裝箱,反之稱為拆箱

intj=4;

stringstr=j.ToString();〃裝箱

intk=(int)str;〃拆箱

運算符

算術(shù)運算符

運算符說明

+加法運算符

減法或負(fù)值

*乘法運算符

/除法運算符

按位求補(bǔ)運算

%求模運算

前置后置增量運算

—前置后置減量運算

賦值運算符

運算符說明

賦值運算符

+=a+=b等效于a=a+b

*=

/=

%=

關(guān)系運算符

運算符說明

等于

!=不等于

<小于

<=小于或等于

>大于

>=大于或等于

邏輯運算符

運算符說明

&按位與

1按位或

A按位異或

&&邏輯與

II邏輯或

1邏輯非

?:三元運算

對象運算符

運算符說明

(<type>)類型強(qiáng)制轉(zhuǎn)換運算符

[]訪問數(shù)組或集合的個元素,或者作為索引器運算符

typeof返回對象類型

sizeof檢索結(jié)構(gòu)的大小

句號成員訪問

is對象比較,用來確定一個對象是否派生自另一個類

as執(zhí)行對象向下轉(zhuǎn)換,失敗時返回空值

new調(diào)用構(gòu)造函數(shù)。對于引用類型,在堆上分配一個新對象。對

于值類型,值類型的字段被初始化為默認(rèn)值

間接尋址和地址運算符

運算符說明

*取地址所含值

&取值的地址

->訪問結(jié)構(gòu)指針成員

其他運算符

運算符說明

checked打開算術(shù)檢查

unchecked關(guān)閉算術(shù)檢查

程序流程和異常處理

條件語句

if-else語句:

if(條件二)

〃條件二成立時執(zhí)行

elseif(條件二)

〃條件二成立時執(zhí)行

}

else

//條件都不成立時執(zhí)行

}

switch語句

給一個或幾個條件語句求值,與包含在case子句中的一個或兒個常量表達(dá)示進(jìn)行比較,

如果表達(dá)式匹配case子句,則執(zhí)行后而后面的代碼。若表達(dá)式不匹配任何case子句,defoult

關(guān)鍵字執(zhí)行后面的代碼塊。

Switch(表達(dá)式)

{

case分支表達(dá)式一:

執(zhí)行語句

break;

case分支表達(dá)式二:

執(zhí)行語句

break;

case分支表達(dá)式三:

執(zhí)行語句

break;

default:

默認(rèn)語句

break;

表達(dá)式必須是一個預(yù)定義的整型類型或String。Case子句以?個冒號結(jié)束,代碼不需要

包括在花括號中。可以把兩個或多個case子句放在一起。分支內(nèi)必須使用break語句跑出

switch語句。也可以goto語句轉(zhuǎn)到另一個分支。

迭代循環(huán)

for語句

fbr(初值;條件表達(dá)式;增值表達(dá)式)

〃循環(huán)語句

}

foreach語句

fbreach(type_valueinlenumcrable)

//循環(huán)語句

}

while語句

while(條件)

{

〃循環(huán)體

dowhile語句

do

//循環(huán)體

}while(條件)

跳轉(zhuǎn)語句

break語句

用來退出do-while、for>fbreach或while循環(huán),還用于退出switch語句。

Continue語句

用來退出循環(huán)的肖前執(zhí)行,返回循環(huán)頂部再次循環(huán)。

Goto語句

跳到另一行代碼。后面跟一個標(biāo)號名。標(biāo)號將在程序的另外地方定義,它后面帶一個冒

號。

不能跳到一個循環(huán)語句的中間,不能從一個類或一個finally塊跳出。對于goto語句比

較合法的使用是,跳Hiswitch語句中的case了句。

Return語句

用來退出一個返回值為非void的方法。返回值為void的方法可以使用return語句,也

可以不使用。

異常處理

在C#中,異常處理的實現(xiàn)是通過使用try、catch、finally關(guān)鍵字定義代碼塊。

Try

{代碼}

catch(異常類型)

{異常處理代碼}

finally

{必執(zhí)行的代碼}

一個try代碼塊可以關(guān)聯(lián)幾個catch代碼塊,每個catch代碼塊捕捉不同的異常類型。

Finally代碼塊在程序控制離開try代碼塊時執(zhí)行。用來執(zhí)行必要的清除操作。

局部變量

局部變量是在方法內(nèi)定義的變量。在類級聲明的變量稱為字段。

局部變量聲明和賦值

每個變量在聲明時必須定義變量的類型:<type><變量名〉;

訪問修飾符如internal/private/protected/public/readonly/static關(guān)鍵字不能用于局部變

量,因為局部變量不能在定義它們的方法或代碼塊之外訪問。

一個聲明語句中,可以聲明多個某種類型的變量:

intI,j,k;

所有的變量在使用前都必須賦值。可以在聲明語句中賦值,也可以以后在代碼中再賦值。

一個例外是使用out關(guān)鍵字給方法傳遞?個未初始化的變量。

通過使用new運算符調(diào)用類構(gòu)造函數(shù),或者提供數(shù)組元素的一個列有,也可以在聲明

引用類型變量時對它們進(jìn)行初始化。

局部變量的作用域

一個變量在特定的代碼塊中,能夠被編譯器識別,并能夠被訪問,這個代碼塊就是變量

的作用域。局部變量的作用域開始于聲明它的那一點,雖然直到賦值才能訪問它。一旦定義

變量的方法退HI,或包含變量的代碼塊執(zhí)行完畢,該變量就離開了作用域。同一作用域中的

兩個變量不能同名,但不同作用域中的變量可以有相同的名稱。

由于子作用域完全嵌套在父作用域中,因此在子作用域中聲明的變量不能和父作用域中

的局部變量同名。

數(shù)組

.NET定義了兩個封裝數(shù)組的類。Array類代表一個不可變的對象數(shù)組,一旦設(shè)置長度,

就不能改變它。另一個是ArrayList,它的長度可以即時調(diào)整。

創(chuàng)建一維數(shù)組

type[]arrayName;

arrayName=newtype[length];

或者:type[]arrayName=newtype[length];

創(chuàng)建多維數(shù)組

type[,]arrayName=newtypefnumRows,numCols];〃兩維數(shù)組

創(chuàng)建更多維數(shù)組的方法是增中逗號的數(shù)量。

要創(chuàng)建一個行數(shù)固定,列數(shù)可變的二維鋸齒形數(shù),語法為:

type[][]arrayName=newtype[numrows][];

arrayName[O]=newtype[numColsO];

arrayName[1]=newtype[numCols1];

arrayName[2]=newtype[numCols2];

初始化數(shù)組

方法是聲明數(shù)組時初始化它的元素:

string[]names={"Mark","Maria”,"Scott“,“Diana”};

或者:

string[]names=newstring口{“Mark","Maria”,"Scott“,“Diana"};

可以在多維數(shù)組中執(zhí)行相似的初始化操作。每行的初始化值放在花括號中

string口names={{"Diana","Reid''},{"Ceryl”JSpada''},{"Scott","Palmer”}};

訪問數(shù)組元素

要訪問數(shù)組的元素,只需要把要訪問的元素的下票放在數(shù)組名后面的方括號中。

C#數(shù)組的下標(biāo)都是從0開始,如果使用了無效的下標(biāo),系統(tǒng)將拋聘個異常錯誤。

數(shù)組屬性和方法

可以使用數(shù)組的GetLength()方法得出數(shù)組的長度。

Rank屬笥返回數(shù)組的維數(shù)

Length屬性反回數(shù)組元素的總數(shù)

Reverse方法反轉(zhuǎn)數(shù)組元素的順序。

Sort方法按照字母順序或其他算法排列數(shù)組元素。

Clear方法把值類型的數(shù)組的一個或多個元素設(shè)為0,把引用類型元素設(shè)為空。

Indexof和lastindexof方法在數(shù)組中線性查找給定值的第一個具體值或最后一個具體值。

面向?qū)ο蟪绦蛟O(shè)計

類是C#中的兩種基本封裝構(gòu)造之一(另一個是結(jié)構(gòu))。每個可執(zhí)行的語句必須放在類或

結(jié)構(gòu)中。類定義作為大多數(shù)C#程序的基本構(gòu)件的引用類型。類是“面向?qū)ο缶幊獭敝械摹皩?/p>

象”的藍(lán)圖。

類是一種復(fù)合的引用類型,因為它可以包含數(shù)據(jù)成員、函數(shù)和嵌套類型。數(shù)據(jù)成員可以

包括常量和實例與靜態(tài)變量字段。函數(shù)成員可以包括方法、屬性、構(gòu)造函數(shù)、析構(gòu)函數(shù)、運

算符、索引器和事件。

C#有一個強(qiáng)大的功能,就是繼承的概念。繼承允許我們通過擴(kuò)展現(xiàn)有基類的功能開發(fā)

一個新的派生類。派生類可以訪問基類中定義的構(gòu)造函數(shù)、方法、運算符等。這可以讓我們

復(fù)用現(xiàn)有的代碼并設(shè)置類的層次結(jié)構(gòu)。.NETFramework中的每個類和自己編寫的每個類的

層次結(jié)構(gòu)都派生自O(shè)bject類。Object類是C#中最終的基類。

定義類

可使用class關(guān)鍵字定義類。類的主體放在花括號中。我們前面說過,類的定義可以包

含任意數(shù)量的數(shù)據(jù)成員、函數(shù)和嵌套類型:

〈modifier〉class<class_name>

{

字段

方法

)

類修飾符

類的定義可以使用abstract、internal、new、private>protected>public或sealed關(guān)鍵字

進(jìn)行修改。internal、private、protected和public關(guān)鍵字定義對類的訪問。在命名空間中聲明

的類只能有public或internal訪問屬性。嵌套類(在另一個類中定義的類)可以具有以上4

種訪問類型中的一種,還可以有protectedinternal訪問類型,它等效于“受保護(hù)的或內(nèi)部的”

訪問。不指定訪問修改符,這時類的訪問類型默認(rèn)為internal。

修飾符說明

abstract不能創(chuàng)建該類的實例。這意味著該類的作用是作為基類。抽象類不能

密封

internal該類只能從同一個程序集的其他類中訪問。這是非嵌套類型的默認(rèn)訪

問方式。如果沒有指定修飾符,則類的訪問方式為internal

new只用于嵌套的類。它指明類隱藏一個同名的被繼承成員

private內(nèi)部使用,可以用在嵌套類

protected只能從定義它的類中和自此派生的類中訪問

public可以被任何其他類訪問

sealed該類不能作為其他類的基類。換句話,該類不能被繼承。類不能既是

密封的,又是抽象的

注意:Quad類的訪問類型默認(rèn)為internal。只能在同一程序集內(nèi)部訪問。

定義類示例

創(chuàng)建一個類實例

類的實例是一個引用類型的變量。因此,對象存放在堆中。創(chuàng)建類實例的語法中使用了

new關(guān)鍵字。

Class_namevariable_name=newclass_name(arguments);

New關(guān)鍵字的作用是調(diào)用??個稱為構(gòu)造函數(shù)的特殊函數(shù)。傳遞給構(gòu)造函數(shù)的參數(shù)?般

用來初始化類實例的數(shù)據(jù)成員,雖然構(gòu)造函數(shù)可以不帶參數(shù),并在以后進(jìn)行所需字段的初始

化。

有些類可能沒有可訪問的構(gòu)造函數(shù),這種情況下就不能用構(gòu)造函數(shù)來實例化該對象。這

些對象的實例?般是在.NETFramework的方法內(nèi)部創(chuàng)建,這些方法返回對類實例的引用。

也可以用這種方法檢索具有可訪問構(gòu)造函數(shù)的許多類的實例。例如,F(xiàn)ile類的Create。方法

(一個靜態(tài)方法)返回對FileStream對象的引用。可以使用下面的語法對應(yīng)?個名為data.inp

的文件實例化--個FileStream對象:

TypetypeTemp=testQ.GetType();

構(gòu)造函數(shù)

構(gòu)造函數(shù)是一個特殊的方法,一般用為初始化類實例的數(shù)據(jù)成員。構(gòu)造函數(shù)名和類名總

是相同的。構(gòu)造函數(shù)沒有返回值。類可以定義任意數(shù)量的構(gòu)造函數(shù)。運行時根據(jù)傳遞給構(gòu)造

函數(shù)的輸入?yún)⒋_定調(diào)用哪個構(gòu)造函數(shù)。

構(gòu)造函數(shù)訪問修飾符常用public和protected,公有構(gòu)造函數(shù)沒有訪問上的限制。它可以

在任何地方調(diào)用。訪問類型為protected的構(gòu)造函數(shù)只能被定義它的類型和定義它的類型所

派生的類型訪問。

如果沒有顯式定義構(gòu)造函數(shù),系統(tǒng)將提供一個默認(rèn)的、不帶參數(shù)的public構(gòu)造函數(shù),它

將把數(shù)據(jù)成員初始化為默認(rèn)值。如果希望拒絕對該構(gòu)造函數(shù)的公有訪問,可以用一個不同的

訪問級別聲明這個構(gòu)造函數(shù)。

如果定義了一個無參數(shù)的private構(gòu)造函數(shù),我們將阻止該類被實例化(這種做法可以

針對這樣的類:它只有靜態(tài)成員,而又不能聲明為abstract,因為我們想把它像System.Math

類一樣聲明為sealed)()

構(gòu)造函數(shù)示例

調(diào)用基類構(gòu)造函數(shù)

當(dāng)創(chuàng)建類的實例時,它的創(chuàng)建工作包括它的基類的創(chuàng)建。從基類繼承的任何數(shù)據(jù)成員必

須進(jìn)行初始化。派生類的構(gòu)造函數(shù)的一個操作是從它的直接基類中調(diào)用一個構(gòu)造函數(shù)。這個

操作可以使用基類的默認(rèn)(無參數(shù))構(gòu)造函數(shù)隱式地進(jìn)行,也可以讓派生類的構(gòu)造函數(shù)顯式

調(diào)用基類的構(gòu)造函數(shù)。

如果基類沒有定義無參數(shù)的構(gòu)造函數(shù),就必須顯式地調(diào)用一個基類構(gòu)造函數(shù)。調(diào)用基類

構(gòu)造函數(shù)是使用冒號加base關(guān)鍵字。這個語法放在派生類的構(gòu)造函數(shù)名的后面。基類構(gòu)造

函數(shù)需要的任何參數(shù)以正常方式在圓括號中傳遞給構(gòu)造函數(shù)。

調(diào)用基類構(gòu)造函數(shù)示例

調(diào)用在同一樣類中定義的構(gòu)造函數(shù)

我們可以和調(diào)用基類構(gòu)造函數(shù)相似的方式調(diào)用在同個類中定義的構(gòu)造函數(shù)的另一種

重載形式。調(diào)用的方法是使用“:this”語法并給構(gòu)造函數(shù)提供適當(dāng)?shù)妮斎雲(yún)ⅰ_@樣做的的

?個原因是避免在構(gòu)造函數(shù)之間重復(fù)編寫代碼。

靜態(tài)構(gòu)造函數(shù)

使用static關(guān)鍵字指定,通常用于初始化靜態(tài)的數(shù)據(jù)成員。靜態(tài)的數(shù)據(jù)成員與一個類型

相關(guān),而不是與類型的一個實例相關(guān)。靜態(tài)構(gòu)造函數(shù)不允許有訪問修飾符。不能顯式地調(diào)用

靜態(tài)構(gòu)造函數(shù),它在加載類是被運行時調(diào)用一次——在創(chuàng)建類的任何實例和引用類的任何靜

態(tài)成員之前。靜態(tài)的構(gòu)造函數(shù)不被繼承。靜態(tài)構(gòu)造函數(shù)從來不被顯式調(diào)用,它只在運行時調(diào)

用。

示例:靜態(tài)構(gòu)造函數(shù)

析構(gòu)函數(shù)和Finalize。方法

析構(gòu)函數(shù)是在破壞一個對象時調(diào)用的方法。c#使用一個垃圾收集器來自動完成大部分

的類似工作。一般的準(zhǔn)則是,除非有迫不得己的原因,不要使用析構(gòu)函數(shù),而應(yīng)該把清除操

作交給運行時完成。

在c#中,定義析構(gòu)函數(shù)的方法是把個代字號(~)放在類名的前面

如果使用析構(gòu)函數(shù),最重要的一點是注意我們能預(yù)計它什么時候調(diào)用——直到垃圾收集

器運行并把對象從內(nèi)存中清除時,它才被執(zhí)行。由于這個原因,如果在破壞類時,您有很昂

貴的非托管資源要釋放,一般更傾向于使用Close。或Dispose。方法。當(dāng)對象不再使用時,

程序員可以顯式地調(diào)用這兩個方法。事實上,析構(gòu)函數(shù)都不能保證被調(diào)用,因為我們可以通

過調(diào)用System.GC類的SuppressFinalize。方法告訴垃圾收集器不要調(diào)用對象的析構(gòu)函數(shù)。

處理托管和非托管資源

在C#的類型中有兩種資源。一種是在.NET中定義的長管資源。另一種是類型可以訪問

的非托管的外部資源。運行時可以在調(diào)用與類型相關(guān)的析構(gòu)函數(shù)時處理非托管資源。但是,

也可以實現(xiàn)【disposable接口,允許我們的類的客戶端顯式要求釋放資源。

【disposable接口聲明一個方法Dispose。,它不帶參數(shù),返回類型為void。用來釋放和對

象相關(guān)的托管和(或)非托管資源。實現(xiàn)【disposable接口的每個類都必須實現(xiàn)Dispose。方

法。

滿足這兩種處理需要的一個方法是再定義一個帶一個bool參數(shù)的Dispose。方法。如果

參數(shù)為true,托管和非托管資源都進(jìn)行處理。如果參數(shù)為flase,只處理非托管資源。第二個

Dispose。方法被無參數(shù)的Dispose。方法調(diào)用,并且是在該析構(gòu)函數(shù)方法的內(nèi)部調(diào)用。

示例:使用Dispose處理非托管資源

using語句

當(dāng)using語句應(yīng)用于對明時,using語句后面的代碼塊執(zhí)行后馬上處理對象占用的資源。

資源的處理是通過調(diào)用對象的Dispose。方法。不要把它和using關(guān)鍵字混淆,后者用來在不

使用完全限定的類型名的情況下訪問命名空間的內(nèi)容。

Using(object)

{

//codetoexecute

繼承

繼承是面向?qū)ο缶幊痰闹е唬荗OP鼓勵代碼復(fù)用的一種方式.繼承可以通過托展

現(xiàn)有基類的功能來創(chuàng)建-,個新的派生類.繼承也允許建立類的層次結(jié)構(gòu).公用功能可以放在基

類中,可以創(chuàng)建任意數(shù)量的派生類來利用此功能,而不用內(nèi)部復(fù)制這些功能.

派生類繼承自基類。在類的聲明中,可以通過在基類名的后面加冒號來表示繼承。

PublicclassEagle:Bird

C#只支持類的單一繼承。類只能有一個直接的基類。雖然它的基類也能有一個基類。

派生類在訪問基類時有定的限制。訪問類型為private的基類成員不能被派生類訪問。

訪問類型為internal的基類成員只能被同一個程序集中的派生類(或任何類)訪問。派

生類能夠自由訪問protectedprotectedinternal和public基類成員。

示例:類的繼承

用戶定義類型之間的強(qiáng)制轉(zhuǎn)換

某些用戶定義的類型之間也可以進(jìn)行轉(zhuǎn)換,如類、結(jié)構(gòu)和接口。大多數(shù)轉(zhuǎn)換要求在轉(zhuǎn)換

的原類型或目標(biāo)類型內(nèi)定義強(qiáng)制轉(zhuǎn)換,但許多轉(zhuǎn)換允許隱式地進(jìn)行,不用編寫客颶的代碼。

可以隱式轉(zhuǎn)換的類型

原類型目標(biāo)類型

任何類型object

任何派生類基類

任何類或結(jié)構(gòu)被該類或結(jié)構(gòu)實現(xiàn)的任何接口

null任何引用類型

另外,可以顯式地把接口類型轉(zhuǎn)換為實現(xiàn)該接口的類,可以把基類強(qiáng)制轉(zhuǎn)換回子類,但

只有該對象屬于那個具體類型才行。在其他情況下,需要在代碼定義強(qiáng)制轉(zhuǎn)換。

示例:派生類之間的強(qiáng)制轉(zhuǎn)換

自定義的強(qiáng)制轉(zhuǎn)換

用戶定義的強(qiáng)制轉(zhuǎn)換必須是public和static。我們還指定強(qiáng)制轉(zhuǎn)換是隱式(implicit)的

還是顯式(explicit)的(隱式的強(qiáng)制轉(zhuǎn)換也可以顯式地進(jìn)行),目標(biāo)類型,和源類型。

示例:自定義的強(qiáng)強(qiáng)制轉(zhuǎn)換

不允許進(jìn)行的強(qiáng)制轉(zhuǎn)換

不能定義默認(rèn)允許的強(qiáng)制轉(zhuǎn)換(如把一個類強(qiáng)制轉(zhuǎn)換為?個實現(xiàn)的接口),也不能定義

從基類到繼承類的強(qiáng)制轉(zhuǎn),以下下表所列的轉(zhuǎn)換:

原類型目標(biāo)類型

任何類型相同類型

任何類型object

object任何類型

任何類型任何接口

任何接口任何類型

任何派生類基類

基類任何派生類

結(jié)構(gòu)

結(jié)構(gòu)是和類相似的一種封裝構(gòu)造,因為它可以包含數(shù)據(jù)、類型和函數(shù)成員。但和類不同

的是,結(jié)構(gòu)是值類型,因此存放在內(nèi)存中稱為棧的地方。結(jié)構(gòu)通常用來存放簡單數(shù)據(jù)類型。

結(jié)構(gòu)與類之間的差異

因為結(jié)構(gòu)存放在棧中并按值傳遞,和存放在堆中的一個可比的類對象相比,它們具有性

能上的優(yōu)勢。原因之一,值類型的分配憶于引用類型。原因之二,存放在棧中的值一離開作

用域就立即被收回。不用等待垃圾懼器來完成工作。

但是,如果反結(jié)構(gòu)作為參數(shù)傳遞給一個方法,這種做法會成為一個問題。當(dāng)引用類型傳

遞給方法時,傳遞的只是對對象的引用。而對于結(jié)構(gòu),在傳遞前要復(fù)制它的一個完整的副本。

和引用類型相比,結(jié)構(gòu)越復(fù)雜,復(fù)制造成的性能開銷越大。因此,結(jié)構(gòu)應(yīng)該只用來表示小的

數(shù)據(jù)結(jié)構(gòu)。

結(jié)構(gòu)繼承自System.VaiueType類,而System.ValueType類繼承自object類。所以結(jié)構(gòu)可

以調(diào)用object類的一些方法。

結(jié)構(gòu)和類的另一個區(qū)別是,結(jié)構(gòu)即不能定義無參數(shù)的構(gòu)造函數(shù),又不能定義析構(gòu)函數(shù)。

無參數(shù)的構(gòu)造函數(shù)是由運行時提供的,用來將所有的數(shù)據(jù)成員初始化為默認(rèn)值,而結(jié)構(gòu)定義

的構(gòu)造函數(shù)必須為結(jié)構(gòu)包含水量的每個字段賦值。

最后,和類不同的是,結(jié)構(gòu)不支持實現(xiàn)繼承,雖然它們可以提供?個或多個接口的實現(xiàn)。

結(jié)構(gòu)隱式地從ValueType類和Object類繼承,但它也隱式地是sealed類型,也就是說它不能

作為其他類型的基類。

定義結(jié)構(gòu)

使用struct關(guān)鍵字定義結(jié)構(gòu)。結(jié)構(gòu)的主體部分是用花括號包圍的一個代碼塊。

<access_modifier>struct<struct_name>

{

〃數(shù)據(jù)成員

//方法

因為不能繼承,結(jié)構(gòu)的成員不能聲明為virtual。不能把結(jié)構(gòu)定義為abstract0在結(jié)構(gòu)的

定義中不必使用sealed關(guān)鍵字,因為它的類型默認(rèn)為sealed。

示例:定義結(jié)構(gòu)

創(chuàng)建結(jié)構(gòu)實例

結(jié)構(gòu)實例的創(chuàng)建和初始化也是分為兩步。

struct_namevariable_name=newstruct_name(arguments);

參數(shù)被傳遞給構(gòu)造函數(shù)并用來初始化備構(gòu)的數(shù)據(jù)成員。如果沒有給構(gòu)造函數(shù)提供參數(shù),

則調(diào)用默認(rèn)的構(gòu)造函數(shù)。

如果結(jié)構(gòu)的數(shù)據(jù)成員為公有訪問類型,可以通過直接訪問數(shù)據(jù)成員對它們進(jìn)行初始化。

接口

接口為類或結(jié)構(gòu)提供了藍(lán)圖。它是一個能聲明屬性、索引器、事件和方法的編程構(gòu)造。

它不為這些成員提供實現(xiàn),只提供定義。實現(xiàn)接口的數(shù)據(jù)類型必須提供接口成員的實現(xiàn),但

成員實現(xiàn)的方式要取決于類型的具體需要。

接口中聲明的所有成員隱式地為public和abstract。雖然?個類只能繼承,個基類,但

它可以實現(xiàn)任意數(shù)量的接口。結(jié)構(gòu)也能實現(xiàn)接口。接口本身可以從多個基接口派生。

定義接口

<access>interface<name>

//interfacemembers

在命名空間中聲明的接口可以被授予public或internal訪問類型。嵌套的接口可以被授

予publicprotected^internalxprotectedinternal或private訪問類型。默認(rèn)的訪問方式是internal?

接口成員(屬性、索引器、事件或方法)隱式被聲明為public和abstract訪問類型。它

們聲明時沒有實現(xiàn),沒有訪問修飾符。接口的名稱約定是以一個大寫的字母“I”開始。

publicinterfaceIShape

intNumSides{get;}//一個屬性

doublegetAreaO;//?個方法

}

實現(xiàn)接口

類或結(jié)構(gòu)要以通過在類型定義語句中包括冒號和接口名,來表明它正在實現(xiàn)接口。這和

表明繼承的語法相同。一個類型能夠?qū)崿F(xiàn)多個接口。在這種情況下,接口名前后列出,中間

用逗號分隔。當(dāng)一個類既繼承一個基類又實現(xiàn)一個接口時,基類放在最前面。

PublicclassEagle:Bird,lanimal,Iraptor

一旦類型實現(xiàn)了接口,它必須為接口中聲明的成員提供實現(xiàn)。基類或?qū)崿F(xiàn)的接口從中派

生的任何基接口的成員也必須實現(xiàn)。類型能夠按照它認(rèn)為適當(dāng)?shù)娜魏畏绞綄崿F(xiàn)要求的成員,

只要這種實現(xiàn)符合在接口中聲明的成員語法。例如,可以把方法聲明為virtual,但不能改變

該方法的參數(shù)列表或返回類型。

示例:接口的實現(xiàn)

接口的繼承

接口可以擴(kuò)展另一個接口。接口繼承的語法和類繼承的語法相同,派生的接口語法包括

冒號和基接口的名稱。實現(xiàn)派生接口的類或結(jié)構(gòu)也必須為在基接口中聲明的成員提供實現(xiàn)。

接口支持多重繼承表現(xiàn)在一個接口可以有多個基接口。

PublicinterfaceIcircle:Ishape,Idisposable

{

//Icircleinterfacemember

}

實現(xiàn)Icircle接口的類型必須實現(xiàn)在Icircle>Ishape和Idisposable接口中聲明的成員。

接口映射

類型必須提供其基類列表中所有接口的實現(xiàn)。把成員實現(xiàn)和接口聲明連接在起的過程

稱為接口映射。

編譯器從當(dāng)前的類型開始,在類型層次結(jié)構(gòu)中向上編譯。如果一個類型的基類已經(jīng)實現(xiàn)

了被繼承的接口成員,則該類型就沒有必要這樣做了。

在某些情況下,通過比較能讓事件變簡單。如果在類型中定義的一個方法和在實現(xiàn)的接

口中聲明的一個方法有相同的名稱、返回類型和參數(shù)列表,則該方法被認(rèn)為是一個適當(dāng)?shù)钠?/p>

配。屬性、事件和索引器可以進(jìn)行相似的一對一比較。

但在某些場合,情況會變得更復(fù)雜。例如,一個類實現(xiàn)了兩個接口,這兩個接口聲明了

一個同名、同參數(shù)列表但不同返回類型的方法。不能在同一個類中定義這樣的兩個方法。只

能通過在成員名前加上該成員要關(guān)聯(lián)的接口名稱,便用一種稱為接口成員顯式實現(xiàn)的方法。

顯式實現(xiàn)的接口沒有返回類型,只能通過接口實例訪問。

VoidIbank.Deposit(doubleb)

如果兩個接口聲明的一個成員具有完全相同的簽名,可以把這兩個接口成員都映射到?

個類或結(jié)構(gòu)成員。

枚舉

枚舉是一個便利的值類型,它把名稱映射為整型值.實際上,它創(chuàng)建一系列的別名.別名可

以讓程序更容易理解。枚舉另一個有用的特性是如果使用了沒有在枚舉中定義的值,編譯器

將拋出一個錯誤。

定義一個枚舉

<modifiers>enum<enum_name>:integer_type

(

namel=value1,

name2=value2,

nameN=valueN

}

聲明為命令空間成員的枚舉可以有public或internal訪問屬性。如果沒有指定訪問修飾

符,訪問類型將默認(rèn)為internal。嵌套的枚舉可以有public、protected、internal、protected>

internal或private訪問屬性。

枚舉可以用new關(guān)鍵字修飾,表明它隱藏一個被繼承的成員。枚舉不能被派生,所以

abstract和sealed修飾都不允許使用。您可以選擇為枚舉指定?個整型類型。有效的整型類

型是byte、short>int^long>ubyte^ushort、uint和ulong。默認(rèn)的整型是32位整型,或int。

枚舉定義的體包含枚舉名和值的一個列表。值是可選的。如果不指定值,將使用默認(rèn)值

0/1/2等。名稱或值對用逗號分隔(不是分號)。列表中最后一個元素后面沒有標(biāo)點符號。枚

舉成員隱式的訪問類型為publico

PublicenuiriPlanet

{

Barth=1,

Mars=2,

Venus=3,

Jupiter=4

使用枚舉

Planetp=Planet.Earth;

在條件語句中使用枚舉元素時,不能把枚舉元素直接和一個基本數(shù)據(jù)類型比較。如:

intj=2;if(j=Planet.Mars)

上面這段代碼不會編譯。必須首先把整數(shù)j轉(zhuǎn)換為相主尖的枚舉元素。一種辦法是把這

個整型值強(qiáng)制轉(zhuǎn)換為枚舉的一個實例。

Jintj=2;iR(Planet)j=Planet.Mars)

Enum類的方法

System.Enum類為操作枚舉提供了許多靜態(tài)的方法。

方法說明

GetName()返回指定枚舉類型中指定值所代表的名稱

GetNames()返回指定枚舉中所有的名稱(string數(shù)組)

GetValues()返回枚舉中包含的所有值(Array對象)

IsDefined()檢測某個值是否在指定的枚舉中定義

示例:枚舉

字段

字段是一個在類或結(jié)構(gòu)中定義中聲明的變量,它可以被這個類或結(jié)構(gòu)的所有成員函數(shù)使

用。字段可以是值類型或者是引用類型。大致有兩種類型的字段:實例字段和靜態(tài)字段。

實例字段

實例字段和類型的一個實例相關(guān)。類型的每個實例都有自己的字段副本,并且可以按它

認(rèn)為適當(dāng)?shù)姆绞讲僮鬟@個副本。

實例字段在定義它的類型內(nèi)部總是可以訪問的。讓它在類型外部也能訪問有三種方式。

第一種是使用訪問修飾符把字段指定為internal>protected,protectedinternal或public。

字段默認(rèn)的訪問類型是privateo

第二種方式是使用方法,第三種方式是使用屬性。

和字段關(guān)聯(lián)的其他修飾符包括new、readonly和volatile關(guān)鍵字。New關(guān)鍵字指明該字

段隱藏了基類中定義的一個同名字段,readonly關(guān)鍵字防止字段在賦值后被修改,標(biāo)記為

volatile的字段將限制編譯器或運行時運載它進(jìn)行的指令重排序優(yōu)化操作,主要用于不同步

訪問字段的多線程程序中。

示例:字段的定義

靜態(tài)字段

靜態(tài)字段是和類型本身相關(guān)的字段,而不是和類型的實例相關(guān)的字段。不論創(chuàng)建了多少

類型的實例,靜態(tài)字段只有一個副本。靜態(tài)字段無論什么時候使用總是可用的,而實例字段

只在創(chuàng)建了類型的一個實例時才能使用。

要定義靜態(tài)字段,需要使用static關(guān)鍵字放在字段的聲明語句中。靜態(tài)字段的訪問類型

經(jīng)常設(shè)為public,以允許在定義它的類型的外部訪問。可以使用類型的名稱訪問靜態(tài)字段。

靜態(tài)字段示例

訪問修飾符

可以在字段聲明語句中指定以下訪問類型。如果沒有指定,默認(rèn)為private:

public:可以定義它的類的內(nèi)部和外部自由訪問

internal:只能被在同一個程序集中的定義的類型訪問。

Protected:可以在定義它的類型中訪問,在該類型的派生類型中也可以訪問。

Protectedinternal:可以在同一個程序集中的類型和派生類中訪問。

Private:只能在定義它的類中訪問。

常量字段

使用const關(guān)鍵字放在字段聲明語句中

<modifiers>const<type><fine_Name>=<value>;

常量字段在聲明時必須賦值,并且該值在編譯時必須是可計算的,常量字段隱式為靜態(tài)

的,訪問方式和訪問靜態(tài)字段相同。不能既把一個字段聲明為const,又把它聲明為static。

常量關(guān)鍵字只能用于一種內(nèi)建的值類型,一個string或一個enum。除了字符串外,不

能把引用類型寶義為常量字段。

只讀字段

只讀字段和常量字段相似之處在于,一旦賦值就不能改變。然而,還有更多的賦值機(jī)會:

只讀字段可以在聲明它的地方賦值,或才在它所屬類型的構(gòu)造函數(shù)中賦值,但在別的地方就

不行了。只讀字段默認(rèn)為實例字段,意思是說,對于定義它的類型的每一個實例都有一個不

同的值。只讀字段可是靜態(tài)的,但必須顯式地聲明為靜態(tài)的才行

要指定只讀字段,把readonly關(guān)鍵字放在聲明語句中:

<modifiers>readonly<type><field_name>;

如果不給只讀字段賦值勤,它將使用默認(rèn)值:值類型使用0,引用類型使用空值。下面

列出只讀字段和常量字段的主要差別:

>常量字段總是靜態(tài)的。只讀字段可以是靜態(tài)的,但默認(rèn)不是。

>常量字段在聲明時必須初始化,字段的值在編譯是必須是可計算的。只讀字段可以

是在聲明時初始化或者在構(gòu)造函數(shù)中聲明,或者根本不聲明。賦給只讀字段的值可

以來自在運行時求值的變量。

A常量字段可以用作局部變量;只讀字段不能。

>常量字段只能是內(nèi)建的值類型、字符串或枚舉值。而任何值類型或引用類型都可以

定義為只讀字段。

Lock語句

Lock語句提供對引用類型變量的同步訪問。任何引用類型的變量都可以被鎖定。

Lock(variable)

{

//codetobeexecuted

)

lock語做的就是在指定變量上加一個互斥鎖。互斥鎖真到程序的執(zhí)行離開加鎖的代碼塊

時才解鎖。一次只能有一個線程占用互斥鎖并訪問變量;其他想訪問變量的線程處于休眠狀

態(tài),直到戰(zhàn)友用鎖的線程將鎖釋放。

示例:加鎖

易變字段

在字段聲明中包括volatile修飾符限制了對字段的優(yōu)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論