版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第五節(jié)屬性、索引器、異常處理目標(biāo)理解屬性及其不同的類型、實現(xiàn)理解和使用索引器屬性是類、結(jié)構(gòu)和接口的成員。它們通過存取子(Accessor)提供讀取、寫入或計算私有(Private)字段值的彈性機制。存取子將屬性存取子設(shè)定為get、set或get/set。默認(rèn)情況下[存取子]選項設(shè)定為get/set。存取子選項說明get讀取或計算屬性并傳回屬性和型別值。如果選擇此選項,屬性便是只讀的。set當(dāng)對屬性指派值時,會以提供新值的自變量來叫用set存取子。如果您選擇了此選項,則屬性是唯寫的。get/set選擇此選項時,屬性將同時包含get和set存取子。這是一個讀取寫入屬性。修飾符屬性可以加入下列修飾符之一。static、virtual和abstract修飾符是彼此互斥的。修飾符說明無沒有額外的修飾符Static屬性屬于該類本身而非一個特定的對象。Virtual屬性可以在子類中重寫Abstract屬性是抽象類(AbstractClass)的成員。屬性簡介3-1封裝把一些不重要的細(xì)節(jié)隱藏起來,這樣你可以集中精力處理那些重要的內(nèi)容。但封裝很難被掌握,一個典型的封裝誤用是盲目地把公有字段轉(zhuǎn)為私有字段。例如在上面的例子中,程序定義了一個私有字段hour和SetHour函數(shù)和GetHour函數(shù),而不是定義一個公有的hour字段。如果GetHour函數(shù)只是返回私有字段的值而SetHour函數(shù)只是設(shè)置私有字段的值的話,那么你除了使Time類更難使用外,你不會得到任何好處。
structTime{
publicintGetHour()
{
returnhour;
}
publicvoidSetHour(intvalue)
{
hour=value;
}
privateinthour,minute,second;}staticvoidMain(){
Timelunch=newTime();
lunch.SetHour(12);
Console.WriteLine(lunch.GetHour());}屬性簡介3-1如果字段是公有的,那使用起來是簡單的但如果你使用公有字段的話,你會失去控制權(quán)
要簡化而不是簡單structTime{
publicintHour;
publicintMinute;
publicintSecond;}staticvoidMain(){
Timelunch=newTime();
lunch.Hour=30;
lunch.Minute=12;
lunch.Second=0;
}解決的辦法可以把get和set函數(shù)組合成一個簡單的屬性。屬性的聲明包括一個可選的訪問修飾符(在例子中是public)、返回值(int)、屬性的名字(Hour)和一個包含get和set語句的屬性體。注意:屬性沒有括號,因為屬性不是函數(shù)。屬性的命名規(guī)則應(yīng)符合一般的命名規(guī)則,即公有的使用PascalCase規(guī)則,而非公有的使用camelCase規(guī)則。structTime{
...
publicintHour
//沒有(),是H而不是h
{
get{...}
set{...}
}
privateinthour,minute,second;}Timelunch=newTime();...lunch.Hour=12;...Console.WriteLine(lunch.Hour);get語句當(dāng)讀一個屬性的時候,屬性的get語句自動運行。get語句必須返回一個有確定類型的值。屬性的返回值不能是void(從這里可以推斷出字段的類型也不能是void)。這get語句必須包含一個完整的return語句(retun;這種形式是錯誤的)。get語句可以在retun語句前包含任何其他的語句,但return語句不能省略。注意:get和set不是關(guān)鍵字,可以在任何地方包括get/set語句中聲明一個局部變量、常量的名字是get或set,但最好不要這樣做。
必須返回一個有確定類型的值
功能上就像一個“get函數(shù)”structTime{
...
publicintHour
{
get
{
returnhour;
}
...
}
privateinthour,minute,second;}Timelunch=newTime();...Console.WriteLine(lunch.Hour);//請注意,get和set不是關(guān)鍵字set語句當(dāng)寫一個屬性的時候,屬性的set語句自動運行。在上面的例子中,Time結(jié)構(gòu)類有一個整型屬性Hour,所以賦給這個屬性的值必須是一個整型值。把一個整型值12賦給了lunch的Hour屬性,這個語句會自動調(diào)用屬性的set語句。set語句是通過value標(biāo)識符來獲得屬性的賦值的。例如,如果12被賦給了Hour屬性,那么vaue的值就是12。注意:value不是一個關(guān)鍵字。value只是在set語句中才是一個標(biāo)識符。你可以在set語句外的任何語句聲明value為一變量的名字。通過value標(biāo)識符來進(jìn)行賦值的可以包含任何語句(甚至沒有語句)structTime{
...
publicintHour
{
...
set{
if(value<0||value>24)
thrownewArgumentException("value");
hour=value;
}
}
privateinthour,minute,second;}Timelunch=newTime();...lunch.Hour=12;只讀屬性一個屬性可以不必同時聲明get語句和set語句??梢灾宦暶饕粋€get語句。在這種情況下,屬性是只讀的,任何寫的操作都會導(dǎo)致錯誤。任何寫操作都會導(dǎo)致錯誤
就像一個只讀字段structTime{
...
publicintHour
{
get
{
returnhour;
}
}
privateinthour,minute,second;}Timelunch=newTime();...lunch.Hour=12;//錯誤...lunch.Hour+=2;//錯誤只寫屬性一個屬性可以不必同時聲明get語句和set語句。你可以只聲明一個set語句。在這種情況下,屬性是只寫的,任何讀的操作都會導(dǎo)致錯誤。任何讀操作都是錯誤的structTime{
...
publicintHour
{
set{
if(value<0||value>24)
thrownewOutOfRangeException("Hour");
hour=value;
}
}
privateinthour,minute,second;}Timelunch=newTime();...Console.WriteLine(lunch.Hour);//錯誤...lunch.Hour+=12;//錯誤readonlyvs.constvs.getreadonly和const都是用來標(biāo)識常量const可用于修飾class的field或者一個局部變量;而readonly僅僅用于修飾class的field。const常量的值必定在編譯時就已明確并且恒定的;而readonly常量其值可以在運行時編譯.const常量必須在聲明的同時對其進(jìn)行賦值;而readonly常量則可以根據(jù)情況選擇在聲明的同時對其賦予一個編譯時確定并恒定的值,或者將其值的初始化工作交給實例構(gòu)造函數(shù)完成。const常量屬于類級別而不是實例對象級別并且它不能跟static結(jié)合一起使用,該常量的值將由整個類的所有實例對象共同分享readonly常量既可以是類級別也可以是實例對象級別的,這取決于它的聲明以及初始化工作怎么實施。readonly可以與static結(jié)合使用,用于指定該常量屬于類級別,并且把初始化工作交由靜態(tài)構(gòu)造函數(shù)完成能被const修飾聲明為常量的類型必須是以下的基元類型:sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,float,bool,decimal,string。object,數(shù)組(Array)和結(jié)構(gòu)(struct)不能被聲明為const常量。一般情況下,引用類型是不能被聲明為const常量的,不過有一個例外:string。readonlyvs.constvs.get當(dāng)讀一個屬性的時候,屬性的get語句自動運行。get語句必須返回一個有確定類型的值。屬性的返回值不能是void(從這里可以推斷出字段的類型也不能是void)。這get語句必須包含一個完整的return語句(retun;這種形式是錯誤的)。get語句可以在retun語句前包含任何其他的語句,但return語句不能省略。class
Customer
{
public
Customer(string
name,
int
kind)
{
m_Name
=
name;
m_Kind
=
kind;
}
public
const
int
NORMAL
=
0;
public
const
int
VIP
=
1;
public
const
int
SUPER_VIP
=
2;
private
string
m_Name;
public
string
Name
{
get
{
return
m_Name;
}
}
private
readonly
int
m_Kind;
public
int
Kind
{
get
{
return
m_Kind;
}
}
public
override
string
ToString()
{
if(m_Kind
==
SUPER_VIP)
return
"Name:
"
+
m_Name
+
"[SuperVip]";
else
if(m_Kind
==
VIP)
return
"Name:
"
+
m_Name
+
"[Vip]";
else
return
"Name:
"
+
m_Name
+
"[Normal]";
}
}
索引器索引器(Indexer)是C#引入的一個新型的類成員,它使得對象可以像數(shù)組那樣被方便,直觀的引用。索引器非常類似于屬性,但索引器可以有參數(shù)列表,且只能作用在實例對象上,而不能在類上直接作用。索引器沒有像屬性和方法那樣的名字,關(guān)鍵字this清楚地表達(dá)了索引器引用對象的特征。和屬性一樣,value關(guān)鍵字在set后的語句塊里有參數(shù)傳遞意義。索引器有5種存取保護(hù)級別,和4種繼承行為修飾,以及外部索引器。索引器不能為靜態(tài)(static).語法:[訪問修飾符]數(shù)據(jù)類型
this[數(shù)據(jù)類型標(biāo)識符]{ get{}; set{};}classMyClass
{
publicobjectthis[intindex]
{
get
{
//取數(shù)據(jù)
}
set
{
//存數(shù)據(jù)
}
}
}
索引器的參數(shù)“索引”的特征使得索引器必須具備至少一個參數(shù),該參數(shù)位于this關(guān)鍵字之后的中括號內(nèi)。索引器的參數(shù)也只能是傳值類型,不可以有ref(引用)和out(輸出)修飾。參數(shù)的數(shù)據(jù)類型可以是C#中的任何數(shù)據(jù)類型。C#根據(jù)不同的參數(shù)簽名來進(jìn)行索引器的多態(tài)辨析。中括號內(nèi)的所有參數(shù)在get和set下都可以引用,而value關(guān)鍵字只能在set下作為傳遞參數(shù)。索引器例1classstu{ privatestringname; privateintage; privatestring[]tel=newstring[3];
publicstringthis[intindex] {get { returntel[index]; } set { tel[index]=value; } }
publicstu(stringname,intage,string[]tel) { =name; this.age=age; for(inti=0;i<tel.Length;i++) {this.tel[i]=tel[i]; } }
publicvoiddis() { Console.WriteLine("yournameis{0}",); Console.WriteLine("yourageis"+this.age); for(inti=0;i<tel.Length;i++) { Console.WriteLine(this.tel[i]); } }
publicstringName { get { ; } set { =value; } }
publicintAge { get { returnthis.age; } set { this.age=value; }}}publicclassMainClass{ publicstaticvoidMain() { string[]b=newstring[3]; b[0]="abc"; b[1]="123"; b[2]="325"; stua=newstu("clm",12,b); a.dis(); stub1=newstu("lm",121,b); b1.dis(); b1[0]="111"; b1.dis(); }}索引器例2classClass1{ string[]s_name=newstring[8]; publicstringthis[intnIndex]{ get { returns_name[nIndex]; } set { s_name[nIndex]=value; } }classTest { staticvoidMain(string[]args){ Class1t1=newClass1(); for(inti=0;i<6;i++) t1[i]=Console.ReadLine();
for(inti=0;i<6;i++)
Console.WriteLine(t1[i]); } } }}索引器例3classIndexerClass{privateint[]myArray=newint[100];publicintthis[intindex]//Indexerdeclaration{get{//Checktheindexlimits.
if(index<0||index>=100)
return0;
else
returnmyArray[index];
}set{if(!(index<0||index>=100))
myArray[index]=value;
}}}publicclassMainClass{publicstaticvoidMain(){IndexerClassb=newIndexerClass();
//Calltheindexertoinitializetheelements#3and#5.b[3]=256;b[5]=1024;for(inti=0;i<=10;i++){Console.WriteLine("Element#{0}={1}",i,b[i]);}}}c#中構(gòu)建異常處理
異常是程序運行中發(fā)生的錯誤異常處理是程序設(shè)計的一部分在c#中異常處理是通過Exception基類進(jìn)行的可以創(chuàng)建自己的異常類,但這個類必須是繼承自Exception基類異常將導(dǎo)致不完善或者不需要的結(jié)果,因此在程序設(shè)計中需要處理異常。異常也可以是象“IndexOutOfBounds”這樣的錯誤,這個錯誤表示程序試圖訪問數(shù)組中部存在的元素;比如數(shù)組最大元素為100,當(dāng)試圖訪問元素101時就將會發(fā)生這樣的錯誤如果發(fā)生的異常不是內(nèi)建的,需要創(chuàng)建自己的異常類,當(dāng)然這個類時繼承自Exception基類。C#的異常處理所用到關(guān)鍵字
try
用于檢查發(fā)生的異常,并幫助發(fā)送任何可能的異常。
catch
控制權(quán)更大的方式處理錯誤,可以有多個catch子句。
finally
無論是否引發(fā)了異常,finally的代碼塊都將被執(zhí)行。
throw
用于引發(fā)異常,可引發(fā)預(yù)定義異常和自定義異常。C#異常處理的格式try{
//程序代碼塊;}catch(Exceptione){
//異常處理代碼塊;}finally{
//無論是否發(fā)生異常,均要執(zhí)行的代碼塊;}一個除數(shù)和零的簡單例子:publicclassDivisorIsZero{privatestaticvoidMain(){intdividend=10;intdivisor1=0;intdivisor2=5;intDivideValue;try{DivideValue=dividend/divisor1;
//(1)DivideValue=dividend/divisor2;//(2)System.Console.WriteLine("DivideValue={0}",DivideValue);//(3)這一行將不會被執(zhí)行。}catch{System.Console.WriteLine("傳遞過來的異常值為:{0}",e);}finally{System.Console.WriteLine("無論是否發(fā)生異常,我都會顯示。");}}}C#的異常處理
(1)行被執(zhí)行則會拋出一個異常,如果沒有catch語句,程序會異常終止,使用不帶參數(shù)的catch子句,則可以捕獲任意類型的異常。
如果將(1)行注釋掉,啟用(2)行,這意味該程序運行時不會出現(xiàn)異常,從輸出可知,finally代碼塊仍將被執(zhí)行。C#的異常處理可以給try語句提供多個catch語句,以捕獲特定的異常,如上例中:0作為除數(shù)則會引發(fā)DivideByZeroException類型的異常,上例中的catch語句可以作如下修改:
catch(DivideByZeroExceptione)子句只能捕獲特定的異常,try內(nèi)的程序代碼可能還會產(chǎn)生其它的異常,這些異常只能由catch(Exceptione)來捕獲。catch(DivideByZeroExceptione){
System.Console.WriteLine("零不能作為除數(shù)!異常值為:\n{0}",e);}catch(Exceptione){
System.Console.WriteLine("并非\''零作為除數(shù)引發(fā)的異常\"!異常值為:\n{0}",e);}System名稱空間中常用的異常類System名稱空間中常用的異常類異常類名稱
簡單描述MemberAccessException
訪問錯誤:類型成員不能被訪問ArgumentException
參數(shù)錯誤:方法的參數(shù)無效ArgumentNullException
參數(shù)為空:給方法傳遞一個不可接受的空參數(shù)ArithmeticException
數(shù)學(xué)計算錯誤:由于數(shù)學(xué)運算導(dǎo)致的異常,覆蓋面廣。ArrayTypeMismatchException數(shù)組類型不匹配DivideByZeroException
被零除FormatException參數(shù)的格式不正確IndexOutOfRangeException
索引超出范圍,小于0或比最后一個元素的索引還大InvalidCastException
非法強制轉(zhuǎn)換,在顯式轉(zhuǎn)換失敗時引發(fā)MulticastNotSupportedException不支持的組播:組合兩個非空委派失敗時引發(fā)NotSupportedException調(diào)用的方法在類中沒有實現(xiàn)NullReferenceException引用空引用對象時引發(fā)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 甜菜種植合同法院判決書
- 《藍(lán)田股份分析案例》課件
- 2025年南寧貨運從業(yè)資格證模擬考試題庫及答案解析
- 2025年鹽城道路運輸從業(yè)資格證考哪些項目
- 2025年許昌貨運從業(yè)資格證模擬考試系統(tǒng)
- 2025年云南貨運從業(yè)資格證考試題及答案詳解
- 健身房環(huán)境衛(wèi)生保潔員招聘合同
- 城市景觀照明施工合同范本
- 智能家居網(wǎng)絡(luò)安全操作規(guī)程
- 印刷行業(yè)安全規(guī)程
- [重慶]金佛山景區(qū)蘭花村深度旅游策劃方案
- 數(shù)學(xué)建模案例分析--線性代數(shù)建模案例(20例)
- 市場營銷之4P策略(課堂PPT)
- 中藥材生產(chǎn)管理質(zhì)量管理文件目錄
- 框架柱+剪力墻工程施工鋼筋綁扎安裝施工過程
- 蘇州預(yù)防性試驗、交接試驗費用標(biāo)準(zhǔn)
- 最新【SD高達(dá)G世紀(jì)-超越世界】各強力機體開發(fā)路線
- 泡沫混凝土安全技術(shù)交底
- 完整MAM-KY02S螺桿空壓機控制器MODBUSⅡ通信協(xié)議說明
- 《納米材料工程》教學(xué)大綱要點
- 長春市勞動合同樣本(共10頁)
評論
0/150
提交評論