摘要:[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秒看起
................ YouTube (ASP.NET) 線上教學影片 https://www.youtube.com/channel/UC6IPPf6tvsNG8zX3u1LddvA/
Blog文章 "附的範例" 無法下載,請看 這裡 ...... https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download
請看我們的「售後服務」範圍(嚴格認定)。
......................................................................................................................................................
事先錄製好的影片,並非上課時側錄! 觀看影片時,有如我「一對一」跟您面對面講課。

累積時數約 75~ 80小時...... 第一天(5.5小時)完整內容,"免費"讓您評估
