C#5-屬性-索引器-異常處理_第1頁
C#5-屬性-索引器-異常處理_第2頁
C#5-屬性-索引器-異常處理_第3頁
C#5-屬性-索引器-異常處理_第4頁
C#5-屬性-索引器-異常處理_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論