PDA

View Full Version : آموزش: استفاده از کلاس StringBuilder



tooraj_azizi_1035
شنبه 10 تیر 1391, 20:29 عصر
سلام
در این تاپیک با نحوه تغییر داده محتویات رشته ها آشنا می شوید.
از آن جایی که شی String غیر قابل تغییر است، هر بار که شما از یکی از متد های موجود در کلاس String استفاده می کنید، یک شی String جدید در حافظه ایجاد می نمائید که نیازمند تخصیص فضای جدید از حافظه می باشد.
در مواردی که نیاز به اعمال تغییرات تکراری زیاد روی رشته ها دارید Overhead ناشی از ایجاد زیاد شی String می تواند پرهزینه باشد. کلاس System.Text.StringBuilder (http://msdn.microsoft.com/en-us/library/system.text.stringbuilder) می تواند در هنگامی که نیاز به تغییر رشته بدون ایجاد نمونه ای جدید از آن دارید استفاده شود.
به طور مثال استفاده از System.Text.StringBuilder (http://msdn.microsoft.com/en-us/library/system.text.stringbuilder) می تواند منجر به بالابردن کارایی در هنگامی که چندین نمونه رشته را در یک حلقه با هم تلفیق می کنید بشود.

ایجاد نمونه از روی System.Text.StringBuilder (http://msdn.microsoft.com/en-us/library/system.text.stringbuilder)

StringBuilder MyStringBuilder = new StringBuilder("Hello World!");

تنظیم ظرفیت و طول

گرچه کلاس System.Text.StringBuilder (http://msdn.microsoft.com/en-us/library/system.text.stringbuilder) یک شیء پویاست که به شما اجازه می دهد تا تعداد کاراکترهای درون رشته ای که آن را کپسوله کرده است را بسط دهید، شما می توانید مقداری برای مشخص کردن حداکثر تعداد کاراکتری که می تواند نگهداری کند را تعیین کنید. این مقدار ظرفیت شی نامیده می شود و نباید با طول رشته ای که در حال حاضر StringBuilder (http://msdn.microsoft.com/en-us/library/system.text.stringbuilder) نگهداری می کند اشتباه گرفته شود.

مثلا شما ممکن است بخواهید یک نمونه از StringBuilder (http://msdn.microsoft.com/en-us/library/system.text.stringbuilder) با مقدار "Hello" که دارای طول 5 می باشد ایجاد کنید و ممکن است حداکثر ظرفیت آن را 25 تعیین کنید. وقتی StringBuilder (http://msdn.microsoft.com/en-us/library/system.text.stringbuilder) را تغییر می دهید تا زمانی که ظرفیتش کامل نشده حافظه مجددی برای خودش ایجاد نمی کند.
هنگامی که ظرفیت تکمیل می شود، فضای جدید به طور خودکار تخصیص داده می شود و ظرفیت دو برابر می شود. شما می توانید ظرفیت این کلاس را با استفاده از یکی از متدهای Overload شده تعیین کنید. مثال زیر مشخص می کند که شیء MyStringBuilder می تواند به حداکثر 25 فضا بسط پیدا کند:

StringBuilder MyStringBuilder = new StringBuilder("Hello World!", 25);


از متد EnsureCapacity (http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.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