激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - C# - C#中String和StringBuilder的簡介與區(qū)別

C#中String和StringBuilder的簡介與區(qū)別

2022-03-03 13:44Czhenya C#

今天小編就為大家分享一篇關(guān)于C#中String和StringBuilder的簡介與區(qū)別,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

簡介區(qū)別

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

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

String類型對象的特點(diǎn):

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

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

?
1
2
3
4
5
6
7
8
public static void Main(string[] args)
{
    string s ="abc";
    Console.WriteLine(s); //輸出 abc
    s = s +"def";
    Console.WriteLine(s); //def
    Console.Read();
}

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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對象為動態(tài)字符串,可以對其設(shè)置好的字符數(shù)量進(jìn)行擴(kuò)展。另外,還可以設(shè)置一個最大長度,這個最大長度稱為該StringBuilder對象的容量(Capacity)。

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

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

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

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

2.使用Capacity讀/寫屬性

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

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

StirngBuilder的常用方法

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

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

2:StringBuilder.AppendFormat()。用一個帶格式文本來代替字符串要傳遞的符號。

?
1
2
3
4
5
6
7
8
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)。

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

?
1
2
3
4
5
6
7
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對象中移除指定的字符,就是說從p位置開始刪除n個字符

?
1
2
3
4
5
6
7
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都是字符或字符串。  

?
1
2
3
4
5
6
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 對象的時候,.NET 運(yùn)行庫會為當(dāng)前的對象在內(nèi)存中分配一塊緩存區(qū)域,用以對字符串操作的預(yù)留空間。在使用 StringBuilder 類的時候,最好將容量設(shè)置為字符串可能的最大長度,確保 StringBuilder 不需要重復(fù)分配內(nèi)存。如果字符的容量超過設(shè)置的最大容量,.NET 運(yùn)行庫將自動分配內(nèi)存并翻倍。

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

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對服務(wù)器之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

原文鏈接:https://blog.csdn.net/Czhenya/article/details/77776890

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 黑人操穴| 成人偷拍片视频在线观看 | 成人免费久久网 | 成人福利免费在线观看 | 精品久久久一 | 午夜视频在线免费 | 日韩黄网站 | 亚洲福利在线视频 | 成人福利电影在线观看 | 日本教室三级在线看 | 国产免费午夜 | 中文字幕 亚洲一区 | 亚洲乱搞 | 欧美成人午夜 | 欧美一级不卡视频 | 极品美女一级毛片 | 成人黄色一级电影 | 国产一级毛片不卡 | 精品一区二区三区免费毛片爱 | www.9191.com| 欧美一级高潮 | 成人在线视频在线观看 | 国产伦精品一区二区三区在线 | 久国产精品 | 九九精品在线观看视频 | 久久亚洲线观看视频 | 香蕉国产精品 | 一级毛片免费在线 | 免费黄色一级网站 | 综合激情网 | 99re66热这里只有精品8 | 色综合视频网 | 毛片视频网址 | 国产午夜精品视频免费不卡69堂 | 97久久精品一区二区三区观看 | 欧美一级高清片 | 精品国产一区二区三区久久久蜜月 | 91久久久久久久久久 | 一级黄色在线观看 | 91久久久久久亚洲精品禁果 | 亚洲卡通动漫在线观看 |