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

เมธอด StringBuilder.EnsureCapacity() ใน C# : รับประกันความจุขั้นต่ำ

เมธอด StringBuilder.EnsureCapacity() ใน C# ใช้รับประกันว่าความจุ (Capacity) ของ instance StringBuilder นั้นจะมีอย่างน้อยเท่ากับค่าที่ระบุ หากความจุปัจจุบันน้อยกว่าค่าที่ระบุ จะขยาย buffer ให้เพียงพอ

รูปแบบไวยากรณ์ (Syntax)

public int EnsureCapacity(int capacity);
  • capacity : ความจุขั้นต่ำที่ต้องการรับประกัน
  • คืนค่า : ความจุใหม่หลังจากการปรับ (อาจมากกว่าที่ระบุ)

ตัวอย่างที่ 1: การเพิ่มความจุและ CopyTo

using System;
using System.Text;

public class Demo
{
    public static void Main()
    {
        StringBuilder strBuilder = new StringBuilder("jhbjhb");
        
        Console.WriteLine("String = " + strBuilder);
        Console.WriteLine("StringBuilder capacity = " + strBuilder.Capacity);
        
        strBuilder.EnsureCapacity(20);
        Console.WriteLine("StringBuilder capacity = " + strBuilder.Capacity);
        
        char[] arr = new char[5] { 'a', 'b', 'c', 'd', 'e' };
        strBuilder.CopyTo(1, arr, 1, 3);
        Console.WriteLine("\nCopied String in char array...");
        Console.WriteLine(arr); // ahbje
    }
}

ผลลัพธ์

String = jhbjhb
StringBuilder capacity = 16
StringBuilder capacity = 20
Copied String in char array...
ahbje

ตัวอย่างที่ 2: วงจรชีวิตของ Capacity และ Length

using System;
using System.Text;

public class Demo
{
    public static void Main()
    {
        StringBuilder strBuilder = new StringBuilder("Katie");
        
        Console.WriteLine("String = " + strBuilder);
        Console.WriteLine("\nStringBuilder capacity = " + strBuilder.Capacity);
        Console.WriteLine("StringBuilder length = " + strBuilder.Length);
        
        strBuilder.EnsureCapacity(35);
        Console.WriteLine("\nStringBuilder capacity = " + strBuilder.Capacity);
        Console.WriteLine("StringBuilder length = " + strBuilder.Length);
        
        strBuilder.EnsureCapacity(0); // ไม่ลดความจุลง (เพราะ 0 น้อยกว่าปัจจุบัน)
        strBuilder.Length = 0; // ตั้งค่าความยาวเป็น 0
        Console.WriteLine("\nStringBuilder capacity = " + strBuilder.Capacity);
        Console.WriteLine("StringBuilder length = " + strBuilder.Length);
    }
}

ผลลัพธ์

String = Katie
StringBuilder capacity = 16
StringBuilder length = 5
StringBuilder capacity = 35
StringBuilder length = 5
StringBuilder capacity = 35
StringBuilder length = 0

สรุปและข้อสังเกต

  • EnsureCapacity() ไม่ลดความจุ ลงได้ แค่เพิ่มขึ้นเมื่อจำเป็น
  • ความจุเริ่มต้นคือ 16 ตัวอักษร (หากไม่ระบุใน constructor)
  • การตั้งค่า Length = 0 จะล้างเนื้อหา แต่ ไม่ลด Capacity
  • ใช้ EnsureCapacity() ก่อนเพิ่มข้อมูลจำนวนมาก เพื่อลดการจัดสรรหน่วยความจำซ้ำ (performance)
  • คืนค่าความจุจริงหลังปรับปรุง (อาจมากกว่าที่ขอ เนื่องจากกลไกการขยายแบบสองเท่า)