Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

จุดประสงค์ของคลาส StringBuilder ใน C # คืออะไร?


ใน 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