摘要:[FAQ]String(字串相連)與StringBuilder的差別、原理與優缺點?
有請 msdn網站給我們官方的說明....
(文末有 Youtube影片)
這是一個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的執行速度,請看這篇文章 --
1. 文字數量大
2. 從資料表的欄位取出,且字串長度 忽長忽短時......StringBuilder有絕對的優勢。
他用兩種寫法,比較速度快慢與資源消耗。如果您只想看結論,可以從 09:29秒看起
我將思想傳授他人, 他人之所得,亦無損於我之所有;
猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson
線上課程教學,遠距教學 (Web Form 約 51hr) https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015
線上課程教學,遠距教學 (ASP.NET MVC 約 135hr) https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab
寫信給我,不要私訊 -- mis2000lab (at) yahoo.com.tw 或 school (at) mis2000lab.net
(1) 第一天 ASP.NET MVC5 完整影片(5.5小時 / .NET 4.x版)免費試聽。影片 https://youtu.be/9spaHik87-A
(2) 第一天 ASP.NET Core MVC 完整影片(3小時 / .NET Core 6.0~8.0)免費試聽。影片 https://youtu.be/TSmwpT-Bx4I
ASP.NET遠距教學、線上課程(Web Form + MVC)。 第一天課程, "完整" 試聽。
......... facebook社團 https://www.facebook.com/mis2000lab ......................
......... YouTube (ASP.NET) 線上教學影片 https://www.youtube.com/channel/UC6IPPf6tvsNG8zX3u1LddvA/
Blog文章 "附的範例" 無法下載,請看 https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download
請看我們的「售後服務」範圍(嚴格認定)。
......................................................................................................................................................