




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司住宿合同協(xié)議書模板
- 工人裝修合同協(xié)議書模板
- 2025土地征收貨幣補(bǔ)償合同書
- 加入公司合同協(xié)議書圖片
- 《2025協(xié)商解除勞動合同協(xié)議書(正式版)》
- 2025私募股權(quán)投資基金合同(正式)
- 行政組織理論考生的個人成長試題及答案
- 數(shù)據(jù)庫編程框架分析試題及答案
- 2025年軟件設(shè)計師考試值得掌握的知識試題及答案
- 高效思考2025年監(jiān)理師考試試題及答案
- 2024年山東高考化學(xué)試卷知識點分布
- 福建福州事業(yè)單位考試筆試含答案2024
- 《拼多多營銷策略》課件
- 【北京市人社局】2025年北京市人力資源市場薪酬數(shù)據(jù)報告(一季度)
- 礦山出售合同協(xié)議
- 醫(yī)院5s管理制度
- 2025年西藏自治區(qū)拉薩市城關(guān)區(qū)中考一模歷史試題(原卷版+解析版)
- 嬰兒牛奶蛋白過敏預(yù)防策略(2025版)解讀
- 2025年濟(jì)南市中區(qū)九年級中考英語一模考試試題(含答案)
- 法學(xué)專科畢業(yè)論文-淺論網(wǎng)絡(luò)虛擬財產(chǎn)的法律保護(hù)
- 2025中學(xué)教師資格證《體育學(xué)科知識與教學(xué)能力》考前通關(guān)必練題庫-含答案
評論
0/150
提交評論