ใน C # สตริงจะไม่เปลี่ยนรูป นั่นหมายความว่าคุณไม่สามารถแก้ไขสตริงได้เมื่อสร้างแล้ว การแก้ไขใดๆ ในสตริงจะคืนค่าสตริงใหม่ที่มีการแก้ไข โดยปล่อยให้สตริงเดิมไม่เสียหาย
string word = "aaabbbccc"; string newWord = word.Replace('b', 'd'); Console.WriteLine(word); // prints aaabbbccc Console.WriteLine(newWord); // prints aaadddccc
คลาส StringBuilder แสดงถึงอ็อบเจ็กต์ที่เหมือนสตริงที่สามารถแก้ไขได้ เช่น สตริงของอักขระที่เปลี่ยนแปลงได้ มีการใช้งานที่แตกต่างจากประเภทสตริง ซึ่งแสดงถึงสตริงของอักขระที่ไม่เปลี่ยนรูปแบบ
เมื่อแก้ไขวัตถุสตริงจะสร้างสำเนา การแก้ไขวัตถุสตริงซ้ำๆ อาจทำให้เสียประสิทธิภาพได้ สำหรับการทำซ้ำเล็ก ๆ นั้นเล็กน้อย แต่อาจมีความสำคัญสำหรับการวนซ้ำขนาดใหญ่ StringBuilder ให้ทางเลือกที่มีประสิทธิภาพในการแก้ไขสตริงโดยการต่อท้าย ลบ แทนที่ หรือแทรกอักขระ
StringBuilder รักษาบัฟเฟอร์ภายในเพื่อเก็บอักขระ หากมีเนื้อที่ว่างในบัฟเฟอร์ จะผนวกข้อมูลใหม่ มิฉะนั้น จะสร้างบัฟเฟอร์ใหม่ คัดลอกข้อมูลเก่าไปยังบัฟเฟอร์ใหม่ จากนั้นผนวกข้อมูล
var sb = new StringBuilder(); for (int i = 0; i < 10; i++){ sb.Append("a"); } Console.WriteLine(sb.ToString()); // prints aaaaaaaaaa
ต่อไปนี้เป็นวิธีต่างๆ ในการสร้างวัตถุ StringBuilder
// Initialize a new instance of StringBuilder var sb1 = new StringBuilder(); // Initialize a new instance of StringBuilder using the given capacity var sb2 = new StringBuilder(capacity: 10); // Initialize a new instance of StringBuilder with the given string var sb3 = new StringBuilder(value: "Hello World"); // Initialize a new instance of StringBuilder with the given capacity and the maximum capacity it can grow to var sb4 = new StringBuilder(capacity: 20, maxCapacity: 10); // Initialize a new instance of StringBuilder with the given string and capacity var sb5 = new StringBuilder(value: "Hello", capacity: 20); // Initialize a new instance of StringBuilder from the given substring and capacity var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20);
คลาส StringBuilder มีคุณสมบัติ Length ซึ่งระบุจำนวนอักขระที่อ็อบเจ็กต์มีอยู่ในปัจจุบัน เมื่อเพิ่มอักขระลงในวัตถุ ความยาวของวัตถุจะเพิ่มขึ้นจนกว่าจะถึงความจุ ซึ่งกำหนดจำนวนอักขระสูงสุดที่วัตถุสามารถมีได้ในขณะนี้
หากจำนวนอักขระที่เพิ่มเข้ามาทำให้ความยาวเกินความจุปัจจุบัน คลาสจะจัดสรรหน่วยความจำใหม่ และเพิ่มความจุ จากนั้นอักขระใหม่จะถูกเพิ่มไปยังวัตถุ และคุณสมบัติความยาวจะถูกปรับ
StringBuilder ยังคงเพิ่มหน่วยความจำเพิ่มเติมแบบไดนามิกจนกว่าจะถึงค่าของคุณสมบัติ MaxCapacity หลังจากนั้นจะไม่สามารถจัดสรรหน่วยความจำเพิ่มเติมให้กับวัตถุได้ หากคุณพยายามเพิ่มข้อมูลให้กับวัตถุมากขึ้น มันจะส่งข้อยกเว้น ArgumentOutOfRangeException หรือ OutOfMemoryException
StringBuilder มีวิธีการดังต่อไปนี้ที่ทำให้ง่ายต่อการแก้ไขสตริง
-
ต่อท้าย − ต่อท้ายการแสดงสตริงของอ็อบเจ็กต์ที่ระบุต่ออินสแตนซ์นี้
-
ผนวกรูปแบบ − ผนวกสตริงที่ส่งคืนโดยการประมวลผลสตริงรูปแบบคอมโพสิต ซึ่งประกอบด้วยรายการรูปแบบศูนย์หรือมากกว่า กับอินสแตนซ์นี้ แต่ละรายการรูปแบบจะถูกแทนที่ด้วยการแสดงสตริงของอาร์กิวเมนต์วัตถุที่สอดคล้องกัน
-
ผนวกเข้าร่วม เชื่อมโยงการแสดงสตริงขององค์ประกอบในอาร์เรย์ของวัตถุที่มีให้โดยใช้ตัวคั่นที่ระบุระหว่างสมาชิกแต่ละคน จากนั้นผนวกผลลัพธ์เข้ากับอินสแตนซ์ปัจจุบันของตัวสร้างสตริง
-
ต่อท้ายบรรทัด - ต่อท้ายบรรทัดเริ่มต้นต่อท้ายวัตถุ StringBuilder ปัจจุบัน
-
ชัดเจน − ลบอักขระทั้งหมดออกจากอินสแตนซ์ StringBuilder ปัจจุบัน
-
คัดลอกไปที่ − คัดลอกอักขระไปยัง char span หรือ char array ปลายทาง
-
รับรองความจุ − ตรวจสอบให้แน่ใจว่าความจุของอินสแตนซ์ของ StringBuilder นี้เป็นค่าที่ระบุเป็นอย่างน้อย
-
เท่ากับ − คืนค่า จริง หากอินสแตนซ์นี้และอินสแตนซ์ที่ให้มามีค่าสตริง ความจุ และ MaxCapacity เท่ากัน
-
รับก้อน − ส่งกลับวัตถุที่สามารถใช้ในการวนซ้ำผ่านส่วนของอักขระได้
-
แทรก − แทรกการแสดงสตริงของวัตถุที่ระบุลงในอินสแตนซ์นี้ที่ตำแหน่งอักขระที่ระบุ
-
ลบ − ลบช่วงอักขระที่ระบุออกจากอินสแตนซ์นี้
-
เปลี่ยน − แทนที่การเกิดขึ้นทั้งหมดของอักขระหรือสตริงที่ระบุในอินสแตนซ์นี้ด้วยอักขระหรือสตริงที่ระบุอื่น
-
ToString - แปลงอินสแตนซ์ปัจจุบันเป็นสตริง
ตัวอย่าง
using System; using System.Text; class Program{ static void Main(string[] args){ string word = "aaabbbccc"; string newWord = word.Replace('b', 'd'); Console.WriteLine(word); // prints aaabbbccc Console.WriteLine(newWord); // prints aaadddccc var sb = new StringBuilder(); for (int i = 0; i < 10; i++){ sb.Append("a"); } Console.WriteLine(sb.ToString()); // prints aaaaaaaaaa // Initialize a new instance of StringBuilder var sb1 = new StringBuilder(); // Initialize a new instance of StringBuilder using the given capacity var sb2 = new StringBuilder(capacity: 10); // Initialize a new instance of StringBuilder with the given string var sb3 = new StringBuilder(value: "Hello World"); // Initialize a new instance of StringBuilder with the given capacity and the maximum capacity it can grow to var sb4 = new StringBuilder(capacity: 20, maxCapacity: 50); // Initialize a new instance of StringBuilder with the given string and capacity var sb5 = new StringBuilder(value: "Hello", capacity: 20); // Initialize a new instance of StringBuilder from the given substring and capacity var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20); } }
ผลลัพธ์
aaabbbccc aaadddccc aaaaaaaaaa