سلام
در این تاپیک با نحوه تغییر داده محتویات رشته ها آشنا می شوید.
از آن جایی که شی String غیر قابل تغییر است، هر بار که شما از یکی از متد های موجود در کلاس String استفاده می کنید، یک شی String جدید در حافظه ایجاد می نمائید که نیازمند تخصیص فضای جدید از حافظه می باشد.
در مواردی که نیاز به اعمال تغییرات تکراری زیاد روی رشته ها دارید Overhead ناشی از ایجاد زیاد شی String می تواند پرهزینه باشد. کلاس System.Text.StringBuilder می تواند در هنگامی که نیاز به تغییر رشته بدون ایجاد نمونه ای جدید از آن دارید استفاده شود.
به طور مثال استفاده از System.Text.StringBuilder می تواند منجر به بالابردن کارایی در هنگامی که چندین نمونه رشته را در یک حلقه با هم تلفیق می کنید بشود.
ایجاد نمونه از روی System.Text.StringBuilder
StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
تنظیم ظرفیت و طول
گرچه کلاس System.Text.StringBuilder یک شیء پویاست که به شما اجازه می دهد تا تعداد کاراکترهای درون رشته ای که آن را کپسوله کرده است را بسط دهید، شما می توانید مقداری برای مشخص کردن حداکثر تعداد کاراکتری که می تواند نگهداری کند را تعیین کنید. این مقدار ظرفیت شی نامیده می شود و نباید با طول رشته ای که در حال حاضر StringBuilder نگهداری می کند اشتباه گرفته شود.
مثلا شما ممکن است بخواهید یک نمونه از StringBuilder با مقدار "Hello" که دارای طول 5 می باشد ایجاد کنید و ممکن است حداکثر ظرفیت آن را 25 تعیین کنید. وقتی StringBuilder را تغییر می دهید تا زمانی که ظرفیتش کامل نشده حافظه مجددی برای خودش ایجاد نمی کند.
هنگامی که ظرفیت تکمیل می شود، فضای جدید به طور خودکار تخصیص داده می شود و ظرفیت دو برابر می شود. شما می توانید ظرفیت این کلاس را با استفاده از یکی از متدهای Overload شده تعیین کنید. مثال زیر مشخص می کند که شیء MyStringBuilder می تواند به حداکثر 25 فضا بسط پیدا کند:
StringBuilder MyStringBuilder = new StringBuilder("Hello World!", 25);
از متد EnsureCapacity برای خصول اطمینان از اینکه ظرفیت StringBuilder حداقل برابر مقداری است که به شکل پارامتر به داخل این متد پاس می کنید استفاده کنید. اگر ظرفیت از مقدار ارسال شده بزرگتر باشد تغییری ایجاد نمی شود؛ اما اگر ظرفیت کمتر از مقدار ارسالی باشد ظرفیت کنونی تغییر می کند تا با مقدار ارسالی تطبیق پیدا کند.
using System;
using System.Text;
class Sample
{
public static void Main()
{
StringBuilder sb1 = new StringBuilder("abc");
StringBuilder sb2 = new StringBuilder("abc", 16);
Console.WriteLine();
Console.WriteLine("a1) sb1.Length = {0}, sb1.Capacity = {1}", sb1.Length, sb1.Capacity);
Console.WriteLine("a2) sb2.Length = {0}, sb2.Capacity = {1}", sb2.Length, sb2.Capacity);
Console.WriteLine("a3) sb1.ToString() = \"{0}\", sb2.ToString() = \"{1}\"",
sb1.ToString(), sb2.ToString());
Console.WriteLine("a4) sb1 equals sb2: {0}", sb1.Equals(sb2));
Console.WriteLine();
Console.WriteLine("Ensure sb1 has a capacity of at least 50 characters.");
sb1.EnsureCapacity(50);
Console.WriteLine();
Console.WriteLine("b1) sb1.Length = {0}, sb1.Capacity = {1}", sb1.Length, sb1.Capacity);
Console.WriteLine("b2) sb2.Length = {0}, sb2.Capacity = {1}", sb2.Length, sb2.Capacity);
Console.WriteLine("b3) sb1.ToString() = \"{0}\", sb2.ToString() = \"{1}\"",
sb1.ToString(), sb2.ToString());
Console.WriteLine("b4) sb1 equals sb2: {0}", sb1.Equals(sb2));
Console.WriteLine();
Console.WriteLine("Set the length of sb1 to zero.");
Console.WriteLine("Set the capacity of sb2 to 51 characters.");
sb1.Length = 0;
sb2.Capacity = 51;
Console.WriteLine();
Console.WriteLine("c1) sb1.Length = {0}, sb1.Capacity = {1}", sb1.Length, sb1.Capacity);
Console.WriteLine("c2) sb2.Length = {0}, sb2.Capacity = {1}", sb2.Length, sb2.Capacity);
Console.WriteLine("c3) sb1.ToString() = \"{0}\", sb2.ToString() = \"{1}\"",
sb1.ToString(), sb2.ToString());
Console.WriteLine("c4) sb1 equals sb2: {0}", sb1.Equals(sb2));
}
}
/*
The example displays the following output:
a1) sb1.Length = 3, sb1.Capacity = 16
a2) sb2.Length = 3, sb2.Capacity = 16
a3) sb1.ToString() = "abc", sb2.ToString() = "abc"
a4) sb1 equals sb2: True
Ensure sb1 has a capacity of at least 50 characters.
b1) sb1.Length = 3, sb1.Capacity = 50
b2) sb2.Length = 3, sb2.Capacity = 16
b3) sb1.ToString() = "abc", sb2.ToString() = "abc"
b4) sb1 equals sb2: False
Set the length of sb1 to zero.
Set the capacity of sb2 to 51 characters.
c1) sb1.Length = 0, sb1.Capacity = 50
c2) sb2.Length = 3, sb2.Capacity = 51
c3) sb1.ToString() = "", sb2.ToString() = "abc"
c4) sb1 equals sb2: False
*/
بیشتر:
http://msdn.microsoft.com/en-us/library/2839d5h5