[FAQ]String(字串相連)與StringBuilder的差別、原理與優缺點?

原文位於 http://www.dotblogs.com.tw/mis2000lab/archive/2013/09/09/msdn_string_stringbuilder.aspx

[FAQ]String(字串相連)與StringBuilder的差別、原理與優缺點?

 

 

这是一个FAQ啰。

今天看见msdn网站上一个范例,讲得很清楚

 

除了给自己做一个记录,将来上课能用到

也分享给大家。

 

资料来源:http://msdn.microsoft.com/zh-tw/library/system.string.aspx

=========================================================================================

不变性和StringBuilder 类别

 

String 对象称为不可变动的 (只读),因为建立它之后便"无法" 修改它的值

看起来好像会修改 String 对象的方法,其实是传回 已修改之后的 "" String 对象。

 

由于字符串是不变的 (immutable),执行字符串处理例程重复加入或删除单一字符串  可能会大幅影响效能。

例如,下列程序代码使用随机数产生器,在 0x0001 到 0x052F 的范围中建立含 1000 个字符的字符串。

 

尽管程序代码似乎是使用 字符串串连(C#使用+ 符号。VB使用& 符号)将新的字符附加至名为 str 的现有字符串,

但它实际上会为每个串连作业建立"新的" String 对象

 

using System;

using System.IO;

using System.Text;

 

public class Example

{

   public static void Main()

   {

      Random rnd = new Random();

 

      string str = String.Empty;

      StreamWriter sw = new StreamWriter(@".\StringFile.txt", false, Encoding.Unicode);

 

      for (int ctr = 0; ctr <= 1000; ctr++) {

           str += Convert.ToChar(rnd.Next(1, 0x0530)); 

           if (str.Length % 60 == 0)

               str += Environment.NewLine;          

      }                    

      sw.Write(str);

      sw.Close();

   }

}

 

 

Imports System.IO

Imports System.Text

 

Module Example

   Public Sub Main()

      Dim rnd As New Random()

 

      Dim str As String = String.Empty

      Dim sw As New StreamWriter(".\StringFile.txt", False, Encoding.Unicode)

 

      For ctr As Integer = 0 To 1000

            str &= ChrW(rnd.Next(1, &h0530)) 

            If str.Length Mod 60 = 0 Then str &= vbCrLf          

      Next                    

      sw.Write(str)

      sw.Close()

   End Sub

End Module

 

=========================================================================================

 

对字符串值进行"多重变更的作业中,您可以使用 StringBuilder 类别取代 String 类别。

 

与 String 类别执行个体不同的是,StringBuilder 对象是可变的

 

当您串连、附加或删除字符串中的子字符串时,作业是在单一字符串上执行。

 

当您完成修改 StringBuilder 对象的值时,可以呼叫其 StringBuilder.ToString()方法,将它转换为字符串。

 

下列范例会取代所使用的 String 串连介于 1000 的任意字符到 0x0001 到与 StringBuilder 对象的 0x052F。

 

using System;

using System.IO;

using System.Text;    // for StringBuilder

 

public class Example

{

   public static void Main()

   {

      Random rnd = new Random();

      StringBuilder sb = new StringBuilder();

      StreamWriter sw = new StreamWriter(@".\StringFile.txt", false, Encoding.Unicode);

 

      for (int ctr = 0; ctr <= 1000; ctr++) {

           sb.Append(Convert.ToChar(rnd.Next(1, 0x0530))); 

           if (sb.Length % 60 == 0)

                 sb.AppendLine();          

      }                    

      sw.Write(sb.ToString());

      sw.Close();

   }

}

 

 

 

Imports System.IO

Imports System.Text    '--for StringBuilder

 

Module Example

   Public Sub Main()

      Dim rnd As New Random()

      Dim sb As New StringBuilder()

      Dim sw As New StreamWriter(".\StringFile.txt", False, Encoding.Unicode)

 

      For ctr As Integer = 0 To 1000

            sb.Append(ChrW(rnd.Next(1, &h0530))) 

            If sb.Length Mod 60 = 0 Then sb.AppendLine()          

      Next                    

      sw.Write(sb.ToString())

      sw.Close()

   End Sub

End Module

 

 

 

 

以前测试过,字符串相连、StringBuilder的执行速度,请看这篇文章 -- 

    http://www.dotblogs.com.tw/mis2000lab/archive/2009/11/25/vs2010_vs2008_who_fast.aspx

 

 

1.  文字数量大

 

2.  从数据表的字段取出,且字符串长度忽长忽短时......StringBuilder有绝对的优势。

 

 

 

你可能感兴趣的:(StringBuilder)