




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2014屆畢業(yè)項(xiàng)目致謝本論文是在老師的精心指導(dǎo)下完成的,從論文的選題到最后論文的完成老師給予我很大的幫助,您教學(xué)嚴(yán)謹(jǐn),嚴(yán)格要求,讓我對做學(xué)問有了一個(gè)新的認(rèn)識。畢業(yè)設(shè)計(jì)給我的學(xué)業(yè)畫上了一個(gè)句號,而對于我的人生卻是一個(gè)逗號,我將面臨一個(gè)新的征程。求學(xué)生涯在師長親友的大力支持下收獲頗多。我將牢記師長的教誨,不斷充實(shí)自己。我要把我的敬意和贊美獻(xiàn)給我尊敬的導(dǎo)師,在這里請接收我誠摯的謝意!同時(shí)感謝學(xué)院給我提供的良好學(xué)習(xí)環(huán)境,做畢業(yè)設(shè)計(jì)的環(huán)境。最后,向所有幫助過我的老師及同學(xué)們表示衷心的感謝!謝謝大家!作者姓名:年月日第5章字符串我們一直在使用字符串,C#中string關(guān)鍵字的映射實(shí)際上指向.NET基類System.String。System.String是一個(gè)功能非常強(qiáng)大且用途非常廣泛的基類,但它不是.NET中唯一與字符串相關(guān)的類。其他的用來處理字符串的.NET類還有很多,如System.Text和System.Text.RegularExpressions命名空間中的類等等。一、System.String類System.String是一個(gè)類,專門用于存儲字符串,允許對字符串進(jìn)行許多操作。由于這種數(shù)據(jù)類型非常重要,C#提供了它自己的關(guān)鍵字和相關(guān)的語法,以便于使用這個(gè)類來處理字符串。使用運(yùn)算符重載可以連接字符串:stringmessage1="Hello";
//return"Hello"message1+=",There";
//return"Hello,There"stringmessage2=message1+"!";
//return"Hello,There!"C#還允許使用類似于索引器的語法來提取指定的字符:charchar4=message[4];
//returns'a'.Notethechariszero-indexed這個(gè)類可以完成許多常見的任務(wù),例如替換字符、刪除空白和把字母變成大寫形式等??捎玫姆椒ㄈ绫硭?。方
法作
用Compare比較字符串的內(nèi)容,考慮文化背景(區(qū)域),確定某些字符是否相等CompareOrdinal與Compare一樣,但不考慮文化背景Concat把多個(gè)字符串實(shí)例合并為一個(gè)實(shí)例CopyTo把特定數(shù)量的字符從選定的下標(biāo)復(fù)制到數(shù)組的一個(gè)全新實(shí)例中Format格式化包含各種值的字符串和如何格式化每個(gè)值的說明符IndexOf定位字符串中第一次出現(xiàn)某個(gè)給定子字符串或字符的位置IndexOfAny定位字符串中第一次出現(xiàn)某個(gè)字符或一組字符的位置Insert把一個(gè)字符串實(shí)例插入到另一個(gè)字符串實(shí)例的指定索引處Join合并字符串?dāng)?shù)組,建立一個(gè)新字符串LastIndexOf與IndexOf一樣,但定位最后一次出現(xiàn)的位置LastIndexOfAny與IndexOfAny,但定位最后一次出現(xiàn)的位置PadLeft在字符串的開頭,通過添加指定的重復(fù)字符填充字符串PadRight在字符串的結(jié)尾,通過添加指定的重復(fù)字符填充字符串Replace用另一個(gè)字符或子字符串替換字符串中給定的字符或子字符串Split在出現(xiàn)給定字符的地方,把字符串拆分為一個(gè)子字符串?dāng)?shù)組Substring在字符串中獲取給定位置的子字符串ToLower把字符串轉(zhuǎn)換為小寫形式ToUpper把字符串轉(zhuǎn)換為大寫形式Trim刪除首尾的空白
注意:這個(gè)表并不完整,但可以讓您明白字符串所提供的功能。1、創(chuàng)建字符串如上所述,string類是一個(gè)功能非常強(qiáng)大的類,它執(zhí)行許多很有用的方法。但是,string類存在一個(gè)問題:重復(fù)修改給定的字符串,效率會很低,它實(shí)際上是一個(gè)不可變的數(shù)據(jù)類型,一旦對字符串對象進(jìn)行了初始化,該字符串對象就不能改變了。表面上修改字符串內(nèi)容的方法和運(yùn)算符實(shí)際上是創(chuàng)建一個(gè)新的字符串,如果必要,可以把舊字符串的內(nèi)容復(fù)制到新字符串中。例如,下面的代碼:stringgreetingText="HellofromalltheguysatWroxPress.";greetingText+="Wedohopeyouenjoythisbookasmuchasweenjoyedwritingit.";在執(zhí)行這段代碼時(shí),首先,創(chuàng)建一個(gè)System.String類型的對象,并初始化為文本“HellofromalltheguysatWroxPress.”。注意句號后面有一個(gè)空格。此時(shí).NET運(yùn)行庫會為該字符串分配足夠的內(nèi)存來保存這個(gè)文本(39個(gè)字符),再設(shè)置變量greetingText,表示這個(gè)字符串實(shí)例。從語法上看,下一行代碼是把更多的文本添加到字符串中。實(shí)際上并非如此,而是創(chuàng)建一個(gè)新字符串實(shí)例,給它分配足夠的內(nèi)存,以保存合并起來的文本(共103個(gè)字符)。最初的文本“HellofromallthepeopleatWroxPress.”復(fù)制到這個(gè)新字符串中,再加上額外的文本“Wedohopeyouenjoythisbookasmuchasweenjoyedwritingit.”。然后更新存儲在變量greetingText中的地址,使變量正確地指向新的字符串對象。舊的字符串對象被撤銷了引用——不再有變量引用它,下一次垃圾收集器清理應(yīng)用程序中所有未使用的對象時(shí),就會刪除它。這本身還不壞,但假定要對這個(gè)字符串加密,在字母表中,用ASCII碼中的字符替代其中的每個(gè)字母(標(biāo)點(diǎn)符號除外),作為非常簡單的加密模式的一部分,就會把該字符串變成“IfmmpgspnbmmuifhvstbuXspyQsftt.Xfepipqfzpvfokpzuijtcpplbtnvdibtxffokpzfexsjujohju.”。完成這個(gè)任務(wù)有好幾種方式,但最簡單、最高效的一種(假定只使用String類)是使用String.Replace()方法,把字符串中指定的子字符串用另一個(gè)子字符串代替。使用Replace(),加密文本的代碼如下所示:stringgreetingText="HellofromalltheguysatWroxPress.";greetingText+="Wedohopeyouenjoythisbookasmuchasweenjoyedwritingit.";for(inti='z';i>='a';i--){charold1=(char)i;charnew1=(char)(i+1);greetingText=greetingText.Replace(old1,new1);}for(inti='Z';i>='A';i--){charold1=(char)i;charnew1=(char)(i+1);greetingText=greetingText.Replace(old1,new1);}Console.WriteLine("Encoded:\n"+greetingText);注意:Replace()以一種智能化的方式工作,在某種程度上,它并沒有創(chuàng)建一個(gè)新字符串,除非要對舊字符串進(jìn)行某些改變。原來的字符串包含23個(gè)不同的小寫字母,和3個(gè)不同的大寫字母。所以Replace()就分配一個(gè)新字符串,共26次,每個(gè)新字符串都包含103個(gè)字符。因此加密過程需要在堆上有一個(gè)能存儲總共2678個(gè)字符的字符串對象,最終將等待被垃圾收集!顯然,如果使用字符串進(jìn)行文字處理,應(yīng)用程序就會有嚴(yán)重的性能問題。為了解決這個(gè)問題,Microsoft提供了System.Text.StringBuilder類。StringBuilder不像String那樣支持非常多的方法。在StringBuilder上可以進(jìn)行的處理僅限于替換和添加或刪除字符串中的文本。但是,它的工作方式非常高效。在使用String類構(gòu)造一個(gè)字符串時(shí),要給它分配足夠的內(nèi)存來保存字符串,但StringBuilder通常分配的內(nèi)存會比需要的更多。開發(fā)人員可以選擇顯式指定StringBuilder要分配多少內(nèi)存,但如果沒有顯式指定,存儲單元量在默認(rèn)情況下就根據(jù)StringBuilder初始化時(shí)的字符串長度來確定。它有兩個(gè)主要的屬性:●
Length指定字符串的實(shí)際長度;●
Capacity是字符串占據(jù)存儲單元的最大長度。對字符串的修改就在賦予StringBuilder實(shí)例的存儲單元中進(jìn)行,這就大大提高了添加子字符串和替換單個(gè)字符的效率。刪除或插入子字符串仍然效率低下,因?yàn)檫@需要移動隨后的字符串。只有執(zhí)行擴(kuò)展字符串容量的操作,才需要給字符串分配新內(nèi)存,才可能移動包含的整個(gè)字符串。在添加額外的容量時(shí),從經(jīng)驗(yàn)來看,StringBuilder如果檢測到容量超出,且容量沒有設(shè)置新值,就會使自己的容量翻倍。例如,如果使用StringBuilder對象構(gòu)造最初的歡迎字符串,可以編寫下面的代碼:StringBuildergreetingBuilder=
newStringBuilder("HellofromalltheguysatWroxPress.",150);greetingBuilder.AppendFormat("Wedohopeyouenjoythisbookasmuchasweenjoyed
writingit");
注意:為了使用StringBuilder類,需要在代碼中引用System.Text。在這段代碼中,為StringBuilder設(shè)置的初始容量是150。最好把容量設(shè)置為字符串可能的最大長度,確保StringBuilder不需要重新分配內(nèi)存,因?yàn)槠淙萘孔銐蛴昧?。理論上,可以設(shè)置盡可能大的數(shù)字,足夠給該容量傳送一個(gè)int,但如果實(shí)際上給字符串分配20億個(gè)字符的空間(這是StringBuilder實(shí)例允許擁有的最大理論空間),系統(tǒng)就可能會沒有足夠的內(nèi)存。在調(diào)用Append()方法時(shí),其他文本就放在空的空間中,不需要分配更多的內(nèi)存。但是,多次替換文本才能獲得使用StringBuilder所帶來的性能提高。例如,如果要以前面的方式加密文本,就可以執(zhí)行整個(gè)加密過程,無須分配更多的內(nèi)存:StringBuildergreetingBuilder=
newStringBuilder("HellofromalltheguysatWroxPress.",150);greetingBuilder.Append("Wedohopeyouenjoythisbookasmuchaswe"+"enjoyedwritingit");
Console.WriteLine("NotEncoded:\n"+greetingBuilder);for(inti='z';i>='a';i--){
charold1=(char)i;
charnew1=(char)(i+1);
greetingBuilder=greetingBuilder.Replace(old1,new1);}for(inti='Z';i>='A';i––
){
charold1=(char)i;
charnew1=(char)(i+1);
greetingBuilder=greetingBuilder.Replace(old1,new1);}Console.WriteLine("Encoded:\n"+greetingBuilder);這段代碼使用了StringBuilder.Replace()方法,它的功能與String.Replace()一樣,但不需要在過程中復(fù)制字符串。在上述代碼中,為存儲字符串而分配的總存儲單元是150個(gè)字符,用于StringBuilder實(shí)例以及在最后一個(gè)Console.WriteLine()語句中執(zhí)行字符串操作期間分配的內(nèi)存。一般,使用StringBuilder可以執(zhí)行字符串的操作,String可以存儲字符串或顯示最終結(jié)果。2
StringBuilder成員前面介紹了StringBuilder的一個(gè)構(gòu)造函數(shù),它的參數(shù)是一個(gè)初始字符串及該字符串的容量。還有幾個(gè)其他的StringBuilder構(gòu)造函數(shù),例如,可以只提供一個(gè)字符串:StringBuildersb=newStringBuilder("Hello");或者用給定的容量創(chuàng)建一個(gè)空的StringBuilder:StringBuildersb=newStringBuilder(20);除了前面介紹的Length和Capacity屬性外,還有一個(gè)只讀屬性MaxCapacity,它表示對給定的StringBuilder實(shí)例的容量限制。在默認(rèn)情況下,這由int.MaxValue給定(大約20億,如前所述)。但在構(gòu)造StringBuilder對象時(shí),也可以把這個(gè)值設(shè)置為較低的值://Thiswillbothsetinitialcapacityto100,butthemaxwillbe500.//Hence,thisStringBuildercannevergrowtomorethan500characters,//otherwiseitwillraiseexceptionifyoutrytodothat.StringBuildersb=newStringBuilder(100,500);還可以隨時(shí)顯式地設(shè)置容量,但如果把這個(gè)值設(shè)置為低于字符串的當(dāng)前長度,或者超出了最大容量,就會拋出一個(gè)異常:StringBuildersb=newStringBuilder("Hello");sb.Capacity=100;主要的StringBuilder方法如表所示。名
稱作
用Append()給當(dāng)前字符串添加一個(gè)字符串AppendFormat()添加特定格式的字符串Insert()在當(dāng)前字符串中插入一個(gè)子字符串Remove()從當(dāng)前字符串中刪除字符Replace()在當(dāng)前字符串中,用某個(gè)字符替換另一個(gè)字符,或者用當(dāng)前字符串中的一個(gè)子字符串替換另一字符串ToString()把當(dāng)前字符串轉(zhuǎn)換為System.String對象(在System.Object中被重寫)
其中一些方法還有幾種格式的重載方法。注意:AppendFormat()實(shí)際上會在調(diào)用Console.WriteLine()時(shí)調(diào)用,它負(fù)責(zé)確定所有像{0:D}的格式化表達(dá)式應(yīng)使用什么表達(dá)式替代。下一節(jié)討論這個(gè)問題。不能把StringBuilder轉(zhuǎn)換為String(隱式轉(zhuǎn)換和顯式轉(zhuǎn)換都不行)。如果要把StringBuilder的內(nèi)容輸出為String,唯一的方式是使用ToString()方法。前面介紹了StringBuilder類,說明了使用它提高性能的一些方式。注意,這個(gè)類并不總能提高性能。StringBuilder類基本上應(yīng)在處理多個(gè)字符串時(shí)使用。但如果只是連接兩個(gè)字符串,使用System.String會比較好。3、格式化字符串前面的代碼示例中編寫了許多類和結(jié)構(gòu),對這些類和結(jié)構(gòu)執(zhí)行ToString()方法,都是為了顯示給定變量的內(nèi)容。但是,用戶常常希望以各種可能的方式顯示變量的內(nèi)容,在不同的文化或地區(qū)背景中有不同的格式。.NET基類System.DateTime就是最明顯的一個(gè)示例:可以把日期顯示為10June2008、10Jun2008、6/10/08(美國)、10/6/08(英國)或10.06.2008(德國)。同樣,第6章中編寫的Vector結(jié)構(gòu)執(zhí)行Vector.ToString()方法,是為了以(4,56,8)格式顯示矢量。編寫矢量的另一個(gè)非常常用的方式是4i+56j+8k。如果要使類的用戶友好性比較高,就需要使用某些工具以用戶希望的方式顯示它們的字符串表示。.NET運(yùn)行庫定義了一種標(biāo)準(zhǔn)方式:使用接口IFormattable,本節(jié)的主題就是說明如何把這個(gè)重要特性添加到類和結(jié)構(gòu)上。在顯示一個(gè)變量時(shí),常常需要指定它的格式,此時(shí)我們經(jīng)常調(diào)用Console.WriteLine()方法。因此,我們把這個(gè)方法作為示例,但這里的討論適用于格式化字符串的大多數(shù)情況。例如,如果要在列表框或文本框中顯示一個(gè)變量的值,一般要使用String.Format()方法來獲得該變量的合適字符串表示,但用于請求所需格式的格式說明符與傳遞給Console.WriteLine()的格式相同,因此本節(jié)把Console.WriteLine()作為一個(gè)示例來說明。首先看看在為基本類型提供格式字符串時(shí)會發(fā)生什么,再看看如何把自己的類和結(jié)構(gòu)的格式說明符添加到過程中。以前在Console.Write()和Console.WriteLine()中使用了格式字符串:doubled=13.45;inti=45;Console.WriteLine("Thedoubleis{0,10:E}andtheintcontains{1}",d,i);格式字符串本身大都由要顯示的文本組成,但只要有要格式化的變量,它在參數(shù)列表中的下標(biāo)就必須放在括號中。在括號中還可以有與該項(xiàng)的格式相關(guān)的其他信息,例如可以包含:●
該項(xiàng)的字符串表示要占用的字符數(shù),這個(gè)信息的前面應(yīng)有一個(gè)逗號,負(fù)值表示該項(xiàng)應(yīng)左對齊,正值表示該項(xiàng)應(yīng)右對齊。如果該項(xiàng)占用的字符數(shù)比給定的多,其內(nèi)容也會完整地顯示出來?!?/p>
格式說明符也可以顯示出來。它的前面應(yīng)有一個(gè)冒號,表示應(yīng)如何格式化該項(xiàng)。例如,把一個(gè)數(shù)字格式化為貨幣,或者以科學(xué)計(jì)數(shù)法顯示。數(shù)字類型的常見格式說明符:
格
式
符應(yīng)
用含
義示
例C數(shù)字類型專用場合的貨幣值$4834.50(USA)£4834.50(UK)D只用于整數(shù)類型一般的整數(shù)4834E數(shù)字類型科學(xué)計(jì)數(shù)法4.834E+003F數(shù)字類型小數(shù)點(diǎn)后的位數(shù)固定4384.50G數(shù)字類型一般的數(shù)字4384.5N數(shù)字類型通常是專用場合的數(shù)字格式4,384.50(UK/USA)4384,50(歐洲大陸)P數(shù)字類型百分比計(jì)數(shù)法432,000.00%X只用于整數(shù)類型十六進(jìn)制格式1120(如果要顯示0x1120,需要寫上0x)如果要在整數(shù)上加上前導(dǎo)0,可以將格式說明符0重復(fù)所需的次數(shù)。例如,格式說明符0000會把3顯示為0003,99顯示為0099。這里不能給出完整的列表,因?yàn)槠渌麛?shù)據(jù)類型有自己的格式說明符。本節(jié)的主要目的是說明如何為自己的類定義格式說明符。1.字符串的格式化為了說明如何格式化字符串,看看執(zhí)行下面的語句會得到什么結(jié)果:Console.WriteLine("Thedoubleis{0,10:E}andtheintcontains{1}",d,i);Console.WriteLine()只是把參數(shù)的完整列表傳送給靜態(tài)方法String.Format(),如果要在字符串中以其他方式格式化這些值,例如顯示在一個(gè)文本框中,也可以調(diào)用這個(gè)方法。帶有3個(gè)參數(shù)的WriteLine()重載方法如下://LikelyimplementationofConsole.WriteLine()publicvoidWriteLine(stringformat,objectarg0,objectarg1){
Console.WriteLine(string.Format(format,arg0,arg1));}上面的代碼依次調(diào)用了帶有1個(gè)參數(shù)的重載方法WriteLine(),僅顯示了傳遞過來的字符串的內(nèi)容,沒有對它進(jìn)行進(jìn)一步的格式化。String.Format()現(xiàn)在需要用對應(yīng)對象的合適字符串表示來替換每個(gè)格式說明符,構(gòu)造最終的字符串。但是,如前所述,對于這個(gè)建立字符串的過程,需要StringBuilder實(shí)例,而不是String實(shí)例。在這個(gè)示例中,StringBuilder實(shí)例是用字符串的第一部分(即文本“Thedoubleis”)創(chuàng)建和初始化的。然后調(diào)用StringBuilder.AppendFormat()方法,傳遞第一個(gè)格式說明符“{0,10:E}”和相應(yīng)的對象double,把這個(gè)對象的字符串表示添加到構(gòu)造好的字符串中,這個(gè)過程會繼續(xù)重復(fù)調(diào)用StringBuilder.Append()和StringBuilder.AppendFormat()方法,直到得到了全部格式化好的字符串為止。下面的內(nèi)容比較有趣。StringBuilder.AppendFormat()需要指出如何格式化對象,它首先檢查對象,確定它是否執(zhí)行System命名空間中的接口IFormattable。只要試著把這個(gè)對象轉(zhuǎn)換為接口,看看轉(zhuǎn)換是否成功即可,或者使用C#關(guān)鍵字is,也能實(shí)現(xiàn)此測試。如果測試失敗,AppendFormat()只會調(diào)用對象的ToString()方法,所有的對象都從System.Object繼承了這個(gè)方法或重寫了該方法。在前面給出的編寫各種類和結(jié)構(gòu)的示例中,執(zhí)行過程都是這樣,因?yàn)槲覀兙帉懙念惗紱]有執(zhí)行這個(gè)接口。這就是在前面的章節(jié)中,Object.ToString()的重寫方法允許在Console.WriteLine()語句中顯示類和結(jié)構(gòu)如Vector的原因。但是,所有預(yù)定義的基本數(shù)字類型都執(zhí)行這個(gè)接口,對于這些類型,特別是這個(gè)示例中的double和int,就不會調(diào)用繼承自System.Object的基本ToString()方法。為了理解這個(gè)過程,需要了解IFormattable接口。IFormattable只定義了一個(gè)方法,該方法也叫作ToString(),它帶有兩個(gè)參數(shù),這與System.Object版本的ToString()不同,它不帶參數(shù)。下面是IFormattable的定義:interfaceIFormattable{
stringToString(stringformat,
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 遼寧師范高等專科學(xué)?!督Y(jié)晶化學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 工程項(xiàng)目投資監(jiān)理的合理化意見
- 耐火澆注料施工方案
- 廣東省廣州市2024-2025學(xué)年高二(上)期末生物試卷(含解析)
- 掛梯施工方案
- consul 節(jié)點(diǎn)查詢、服務(wù)提出和節(jié)點(diǎn)驅(qū)逐的命令
- chatbi落地應(yīng)用實(shí)例
- can電路的寄生電容
- ards肺保護(hù)通氣策略講課后點(diǎn)評
- 架空光纜 施工方案
- (完整版)紫外線消毒記錄表
- 鋰電池項(xiàng)目融資計(jì)劃書【范文】
- 高中人音版必修 音樂鑒賞22共筑中國夢課件
- 三八婦女節(jié)主題班會PPT課件
- 員工考勤與請休假管理制度
- 50MW茶光互補(bǔ)光伏發(fā)電項(xiàng)目建議書寫作模板-定制
- LS框架斷路器技術(shù)資料_圖文
- 品質(zhì)異常(8D)改善報(bào)告
- 咳嗽的診斷與治療指南(2015)
- 彎頭重量和表面積明細(xì)表
- 第二章--美國學(xué)前教育--比較學(xué)前教育PPT
評論
0/150
提交評論