真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

String與StringBuilder在C#中有什么區(qū)別

本篇文章給大家分享的是有關(guān)String與StringBuilder在C#中有什么區(qū)別,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

在衡南等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營(yíng)銷(xiāo)推廣,成都外貿(mào)網(wǎng)站制作,衡南網(wǎng)站建設(shè)費(fèi)用合理。

簡(jiǎn)介區(qū)別

String的缺點(diǎn)是每次字符串變量的內(nèi)容發(fā)生了改變時(shí),都必須重新分配內(nèi)存。你想想,如果創(chuàng)建一個(gè)迭代100000次的循環(huán),每次迭代都將一個(gè)字符連接到字符串,這樣內(nèi)存中就會(huì)有100000個(gè)字符串,每個(gè)字符串僅僅與前一個(gè)字符串相伴只是有一個(gè)字符不同,性能影響是很大的。

StringBuilder通過(guò)分配一個(gè)緩存,就是一個(gè)工作區(qū)來(lái)解決這些問(wèn)題,在工作區(qū)中隊(duì)字符串應(yīng)用StringBuilder類(lèi)的相關(guān)方法。包括添加,刪除,移除,插入和替換字符等等。執(zhí)行完之后,將調(diào)用ToString方法把工作區(qū)中的內(nèi)容轉(zhuǎn)換為一個(gè)字符串,方便賦給一個(gè)字符串變量。這樣StringBuilder會(huì)提升一些性能。

String類(lèi)型對(duì)象的特點(diǎn):

1.它是引用類(lèi)型,在堆上分配內(nèi)存
2.運(yùn)算時(shí)會(huì)產(chǎn)生一個(gè)新的實(shí)例
3.String 對(duì)象一旦生成不可改變(Immutable)
4.定義相等運(yùn)算符(== 和 !=)是為了比較 String 對(duì)象的值(而不是引用)

在.NET中String是不可改變對(duì)象,一旦創(chuàng)建了一個(gè)String對(duì)象并給它賦值,它就不可能再改變,也就是你不可能改變一個(gè)字符串的值。這句活初聽(tīng)起來(lái)似乎有些不可思議,大家也許馬上會(huì)想到字符串連接操作,我們不也可以改變字符串嗎?看下面的這段代碼:

public static void Main(string[] args)
{
    string s ="abc";
    Console.WriteLine(s); //輸出 abc 
    s = s +"def"; 
    Console.WriteLine(s); //def 
    Console.Read(); 
}

看起來(lái)我們似乎已經(jīng)把s的值從"abc"改為了"abcdef",實(shí)際上并沒(méi)有改變。string s = "abc";是創(chuàng)建了一個(gè)String對(duì)象它的值是"abc",s指向了它在內(nèi)存中的地址,s += "def";是創(chuàng)建了一個(gè)新的String對(duì)象它的值是"abcdef",s指向了新的內(nèi)存地址。這時(shí)在堆中其實(shí)存在著兩個(gè)字符串對(duì)象,盡管我們只引用了他們中的一個(gè),但字符串"abc"仍然在內(nèi)存中駐留。

前面說(shuō)過(guò)String是引用類(lèi)型,如果我們創(chuàng)建很多個(gè)相同值的字符串對(duì)象,它在內(nèi)存中的指向地址應(yīng)該是一樣的。也就是說(shuō),當(dāng)我們創(chuàng)建了字符串對(duì)象s,它的值是"abc",當(dāng)我們?cè)賱?chuàng)建一個(gè)值為"abc"的字符串對(duì)象str時(shí)它不會(huì)再去分配一塊內(nèi)存空間,而是直接指向了s在內(nèi)存中的地址。這樣可以確保內(nèi)存的有效利用??聪旅娴拇a:

  public static void Main(string[] args)
    {
      string s = "abc";
      Console.WriteLine(s); //輸出 abc  
      Add(s);  //調(diào)用下面方法 
      Console.WriteLine(s); //輸出 def
      Console.Read();
    }
    public static void Add(string str)
    {
      str = "def";
    }
    //改變方法的參數(shù), 使用ref關(guān)鍵字,,
    public static void Main(string[] args)
    {
      string s = "abc";
      Console.WriteLine(s); // 輸出 abc  
      Add(ref s);
      Console.WriteLine(s); //abcdef
      Console.Read();
    }
    public static void Add(ref string str) {
      str = "def";
    }

設(shè)置StringBuilder容量

StringBuilder對(duì)象為動(dòng)態(tài)字符串,可以對(duì)其設(shè)置好的字符數(shù)量進(jìn)行擴(kuò)展。另外,還可以設(shè)置一個(gè)最大長(zhǎng)度,這個(gè)最大長(zhǎng)度稱(chēng)為該StringBuilder對(duì)象的容量(Capacity)。

為StringBuilder設(shè)置容量的意義在于,當(dāng)修改StringBuilder字符串時(shí),當(dāng)其實(shí)際字符長(zhǎng)度(即字符串已有的字符數(shù)量)未達(dá)到其容量之前,StringBuilder不會(huì)重新分配空間;當(dāng)達(dá)到容量時(shí),StringBuilder會(huì)在原空間的基礎(chǔ)之上,自動(dòng)不進(jìn)行設(shè)置,StringBuilder默認(rèn)初始分配16個(gè)字符長(zhǎng)度。有兩種方式來(lái)設(shè)置一個(gè)StringBuilder對(duì)象的容量。

1.使用構(gòu)造函數(shù)

 StringBuilder構(gòu)造函數(shù)可以接受容量參數(shù),例如,下面聲明一個(gè)StringBuilder對(duì)象sb2,并設(shè)置其容量為100。

//使用構(gòu)造函數(shù)
 StringBuilder Mysb1=new StringBuilder("Hello",100);

2.使用Capacity讀/寫(xiě)屬性

 Capacity屬性指定StringBuilder對(duì)象的容量,例如下面語(yǔ)句首先一個(gè)StringBuilder對(duì)象sb3,然后利用Capacity屬性設(shè)置其容量為100。

//使用Capacity屬性
 StringBuilder Mysb2=new StringBuilder("Hello");
 sb3.Capacity=100;

StirngBuilder的常用方法

1:StringBuilder.Append()將內(nèi)容追加到當(dāng)前StringBuilder字符串的結(jié)尾。

public static void Main(string[] args){ 
  StringBuilder Mysb = new StringBuilder("abc:");  
  Mysb.Append(" bcd");  
  Console.WriteLine(Mysb); // 輸出: abc:def
  Console.Read();
}

2:StringBuilder.AppendFormat()。用一個(gè)帶格式文本來(lái)代替字符串要傳遞的符號(hào)。

static void Main(string[] args)
    {
      int Mysb1 = 100;
      StringBuilder Mysb2 = new StringBuilder("你欠我:");
      Mysb2.AppendFormat("{0:C}", Mysb1);
      Console.WriteLine(Mysb2); // 輸出:  你欠我:¥100
      Console.Read();
    }

3:StringBuilder.Insert(int,string)。

將字符串和對(duì)象插入到當(dāng)前StringBuilder字符串的指定位置。使用此方法將一個(gè)單詞插入到 StringBuilder 的第六個(gè)位置。

static void Main(string[] args)
    {
      StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
      MyStringBuilder.Insert(6, "插入");
      Console.WriteLine(MyStringBuilder); //輸出為: Hello 插入World!
      Console.Read();
}

4:StringBuilder.Remove(p,n)。在當(dāng)前StringBuilder對(duì)象中移除指定的字符,就是說(shuō)從p位置開(kāi)始刪除n個(gè)字符

static void Main(string[] args)
    {
      StringBuilder Mysb = new StringBuilder("Hello World!");
      Mysb.Remove(2,2);
      Console.WriteLine(MyStringBuilder); //輸出為:heo world
      Console.Read();
}

5:StringBuilder.Replace(a,b)。就是用b替換a指定字符串,a和b都是字符或字符串。  

static void Main(string[] args)
    {
      string a = "aaa.Baidu.com";
      string b = a.Replace('a','w');
      Console.WriteLine(b);   // 輸出:www.Baidu.com
}

實(shí)際上,當(dāng)我們創(chuàng)建 StringBuilder 對(duì)象的時(shí)候,.NET 運(yùn)行庫(kù)會(huì)為當(dāng)前的對(duì)象在內(nèi)存中分配一塊緩存區(qū)域,用以對(duì)字符串操作的預(yù)留空間。在使用 StringBuilder 類(lèi)的時(shí)候,最好將容量設(shè)置為字符串可能的最大長(zhǎng)度,確保 StringBuilder 不需要重復(fù)分配內(nèi)存。如果字符的容量超過(guò)設(shè)置的最大容量,.NET 運(yùn)行庫(kù)將自動(dòng)分配內(nèi)存并翻倍。

對(duì)于我們 .NET 程序員而言,StringBuilder 與 String 的不同之處就在于,StringBuilder 可以顯示的設(shè)置分配內(nèi)存的大小,而 String 只能根據(jù)你初始化時(shí)的字符串的大小由系統(tǒng)分配足夠的內(nèi)存。

所以,當(dāng)要對(duì)字符串進(jìn)行頻繁的操作的時(shí)候,在 String 和 StringBuilder 之間,我們應(yīng)該選擇 StringBuilder。

以上就是String與StringBuilder在C#中有什么區(qū)別,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


分享標(biāo)題:String與StringBuilder在C#中有什么區(qū)別
當(dāng)前地址:http://weahome.cn/article/gidoje.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部