新聞中心
C#字符串操作之概念的理解在實(shí)際的開(kāi)發(fā)過(guò)程中,對(duì)字符串的操作是經(jīng)常遇到的,其中涉及到字符串拼接、拆分、比較、替換等操作。C#提供了string類(lèi)型,String和StringBuilder兩種類(lèi)來(lái)對(duì)字符串進(jìn)行處理。那么string,String,StringBuilder對(duì)字符串進(jìn)行處理有何異同,在實(shí)際編程中,對(duì)于不同的字符串操作應(yīng)該采用哪種方式來(lái)提高程序的效率呢?本文將對(duì)string,String,StringBuilder進(jìn)行詳細(xì)的解釋和比較,最后在編程過(guò)程中遇到的常用的字符串處理進(jìn)行了總結(jié)。

首先讓我們理解string,String,StringBuilder的概念
C#字符串操作之string
string,msdn給出的解釋就是,string 是C#中的關(guān)鍵字,并且是引用類(lèi)型, string 類(lèi)型表示零或更多 Unicode 字符組成的序列。string 是 .NET Framework 中 String 的別名。但定義相等運(yùn)算符(== 和 !=)是為了比較 string 對(duì)象(而不是引用)的值(后面給出示例解釋這點(diǎn))。
C#字符串操作之String:
String是類(lèi),表示文本,即一系列 Unicode 字符。String 對(duì)象是不可改變的。每次使用 System.String 類(lèi)中的方法之一時(shí),都要在內(nèi)存中創(chuàng)建一個(gè)新的字符串對(duì)象,這就需要為該新對(duì)象分配新的空間。如:當(dāng)我們實(shí)例化一個(gè)String的對(duì)象后,在內(nèi)存中為此對(duì)象分配一個(gè)空間。如下:String str = “hello”;當(dāng)我們修改str的值的時(shí)候,如:str = “hello world”;此時(shí),系統(tǒng)會(huì)為str重新分配一個(gè)空間。這樣原來(lái)的內(nèi)存空間就被浪費(fèi)掉了,只能等待垃圾回收器回收。在需要對(duì)字符串執(zhí)行重復(fù)修改的情況下,與創(chuàng)建新的 String對(duì)象相關(guān)的系統(tǒng)開(kāi)銷(xiāo)可能會(huì)非常昂貴。
C#字符串操作之String與string的區(qū)別:
string 是 .NET Framework 中 String 的別名,string是C#基元類(lèi)型(primitive),簡(jiǎn)單來(lái)說(shuō)就是編譯器直接支持的數(shù)據(jù)類(lèi)型?;?lèi)型要直接映射到Framework類(lèi)庫(kù)(FCL)中的類(lèi)型,例如,C#中一個(gè)基元類(lèi)型int直接映射到System.Int32類(lèi)型,這里int是基元類(lèi)型,System.Int32是FCL類(lèi)型。而String是FCL類(lèi)型的,所以在C#的編譯時(shí),會(huì)自動(dòng)的把string轉(zhuǎn)化為System.String。所以string與String實(shí)質(zhì)上沒(méi)什么區(qū)別,只是在使用string要做一次轉(zhuǎn)換,轉(zhuǎn)換為String。因此,在編碼時(shí)我們推薦使用String。
string雖然為引用類(lèi)型,但是(== 和 !=)是為了比較 string 對(duì)象(而不是引用)的值。
- string a = "hello";
- string b = "hel";
- b = b + "lo";
- string c = "hello";
- Response.Write(a==b); //True
- Response.Write((object)a == (object)b); //False
- Response.Write((object)a == (object)c); //True
a==b比較的是值而非引用。所以a==b為T(mén)rue。當(dāng)創(chuàng)建多個(gè)字符串內(nèi)容相同的對(duì)象時(shí),都只會(huì)指向同一個(gè)引用; a和c都指向同一個(gè)a的引用,并不會(huì)為c重新分配內(nèi)存;這樣即可保證內(nèi)存有效利用;所以上面的(object)a == (object)c比較的是a與c的引用,結(jié)果為T(mén)rue。這里面b由于進(jìn)行了累加操作(b = b + "lo";)b又重新分配了內(nèi)存,所以(object)a == (object)b比較的是引用,所以為False。
接下來(lái)我們?cè)偻ㄟ^(guò)幾個(gè)例子來(lái)理解下String(string)
- String str1 = "abc";
- String str2 = str1;
- str1 = "123";
- Response.Write(str2);//abc
輸出結(jié)果是abc,首先給str賦值為"abc",接著執(zhí)行str2 = str1,使str2和str1指向同一引用,即內(nèi)存地址。當(dāng)執(zhí)行str1 = "123"后,String對(duì)象是不可改變的,實(shí)質(zhì)上str1 = "123"是str1=new string("123")的簡(jiǎn)寫(xiě),它的每一次賦值都會(huì)拋掉原來(lái)的對(duì)象而生成一個(gè)新的字符串對(duì)象,分配新的內(nèi)存空間,str1 = "123"語(yǔ)句編譯器私底下創(chuàng)建了一個(gè)新的字符串對(duì)象來(lái)保存新的字符序列"123",也就是此str1已非彼str1了。因此str1的值的改變也就不能影響先前str1指向地址的值了,當(dāng)然str2的值也就不會(huì)改變了。因此string是不可改變的。
通過(guò)上面的例子,如果我們執(zhí)行下面這些語(yǔ)句:
- String sql = “Select * From T_Test ”;
- sql += “Where id=888 ”;
- sql += “And type=3 ”;
- sql += “Order By Desc”;
實(shí)際上這樣是十分浪費(fèi)內(nèi)存空間的。如果是頻繁的這樣做的話,建議是使用StringBuilder對(duì)象,或者這樣寫(xiě):
- String sql = “Select * From T_Test” +
- “Where id=888 ” + “And type=3” + “Order By Desc ” ;
C#字符串操作之StringBuilder:
出于性能方面的考慮,大量的串聯(lián)或所涉及其他字符串操作應(yīng)通過(guò)StringBuilder類(lèi)來(lái)執(zhí)行。StringBuilder表示可變字符字符串, 它允許我們有效的對(duì)字符串的字符執(zhí)行動(dòng)態(tài)操作,有效的縮減字符串的大小或者更改字符串中的字符。如果字符串變大,超過(guò)已經(jīng)分配的字符的大小,StringBuilder就會(huì)自動(dòng)的分配一個(gè)全新的、更大的數(shù)組,并開(kāi)始使用新的數(shù)組,雖然 StringBuilder 對(duì)象是動(dòng)態(tài)對(duì)象,允許擴(kuò)充它所封裝的字符串中字符的數(shù)量,但是您可以為它可容納的最大字符數(shù)指定一個(gè)值。此值稱(chēng)為該對(duì)象的容量,不應(yīng)將它與當(dāng)前 StringBuilder 對(duì)象容納的字符串長(zhǎng)度混淆在一起。例如,可以創(chuàng)建 StringBuilder 類(lèi)的帶有字符串“Hello”(長(zhǎng)度為 5)的一個(gè)新實(shí)例,同時(shí)可以指定該對(duì)象的最大容量為 25。當(dāng)修改 StringBuilder 時(shí),在達(dá)到容量之前,它不會(huì)為其自己重新分配空間。當(dāng)達(dá)到容量時(shí),將自動(dòng)分配新的空間且容量翻倍??梢允褂弥剌d的構(gòu)造函數(shù)之一來(lái)指定 StringBuilder 類(lèi)的容量。
String 或 StringBuilder 對(duì)象的串聯(lián)操作的性能取決于內(nèi)存分配的發(fā)生頻率。String 串聯(lián)操作每次都分配內(nèi)存,而 StringBuilder 串聯(lián)操作僅當(dāng) StringBuilder 對(duì)象緩沖區(qū)太小而無(wú)法容納新數(shù)據(jù)時(shí)才分配內(nèi)存。因此,如果串聯(lián)固定數(shù)量的 String 對(duì)象,則 String 類(lèi)更適合串聯(lián)操作。這種情況下,編譯器甚至?xí)⒏鱾€(gè)串聯(lián)操作組合到一個(gè)操作中。如果串聯(lián)任意數(shù)量的字符串,則 StringBuilder 對(duì)象更適合串聯(lián)操作;例如,某個(gè)循環(huán)對(duì)用戶輸入的任意數(shù)量的字符串進(jìn)行串聯(lián)
C#字符串操作的概念就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)C#字符串操作有所幫助。
網(wǎng)站題目:C#字符串操作概念的理解淺析
標(biāo)題網(wǎng)址:http://www.5511xx.com/article/dpssjdj.html


咨詢(xún)
建站咨詢(xún)
