یک رشته تغییر ناپذیر است و این به این معناست که بعد از آنکه رشته ای ایجاد شد نمیتوان آن را در حافظه تغییر داد. با استفاده از کلاس StringBuilder میتوان رشته های پویایی ایجاد کرد که قابل تغییر هستند. در این فصل با کلاس StringBuilder آشنا خواهیم شد.
StringBuilder
یک رشته تغییر ناپذیر است و این به این معناست که بعد از آنکه رشته ای ایجاد شد نمیتوان آن را تغییر داد. برای مثال رشته ی جدید "!!Hello World"
فضایی را در حافظه در قسمت heap اشغال می کنند. اکنون با تغییر رشته اولیه "!!Hello World"
به "Hello World!! from Tutorials Teacher"
به جای تغییر و ویرایش آن رشته در همان آدرس از حافظه ، رشته جدیدی در قسمت heap از حافظه ایجاد میشود. این رفتار باعث می شود در مواقعی که ویرایش ، جایگزینی و حذف رشته ها به صورت مکرر انجام میشود از کارایی سیستم کاسته شود.
شکل زیر تخصیص حافظه را برای رشته ها نشان می دهد :
برای حل این مشکل زبان برنامه نویسی سی شارپ کلاس StringBuilder
را معرفی کرده است. StringBuilder
یک شی پویاست که به شما اجازه می دهد تعداد کاراکترهای یک رشته را افزایش دهید. این کلاس با تغییر رشته مورد نظر رشته جدیدی را در حافظه ایجاد نمی کند بلکه به صورت پویا حافظه را برای افزایش کاراکتر های رشته گسترش می دهد.
در شکل زیر نحوه تخصیص حافظه هنگام استفاده از کلاس StringBuilder
نشان داده شده است :
مقدار دهی اولیه
StringBuilder
را می توان همانند کلاس ها مقدار دهی اولیه کرد :
StringBuilder sb = new StringBuilder(); //or
StringBuilder sb = new StringBuilder("Hello World!!");
در هنگام تعریف یک StringBuilder
می توان ظرفیت تعداد کاراکترهای آن را با مشخص کردن عددی در سازنده آن مشخص کرد. برای مثال در نمونه کد آورده شده در زیر ظرفیت StringBuilder
در حافظه برابر با ۵۰ کارکتر مشخص شده است. در این صورت تخصیص حافظه به صورت خودکار تا رسیدن به ظرفیت مشخص شده انجام خواهد شد :
StringBuilder sb = new StringBuilder(50);
//or
StringBuilder sb = new StringBuilder("Hello World!!",50);
متدهای مهم کلاس StringBuilder
(StringBuilder.Append(valueToAppend
: این متد مقدار رشته ای را که به عنوان آرگومان می پذیرد به انتهای رشته StringBuilder اضافه می کنند()StringBuilder.AppendFormat
: این متد مقدار رشته ای را که به عنوان آرگومان می پذیرد با الگوی مشخص شده فرمت بندی می کنند(StringBuilder.Insert(index, valueToAppend
: این متد رشته ای را در مکان مشخص شده از رشته StringBuilder قرار میدهد(StringBuilder.Remove(int startIndex, int length
: این متد تعداد مشخصی از کاراکترها را از مکانی مشخص از رشته StringBuilder حذف می کند(StringBuilder.Replace(oldValue, newValue
: این متد کاراکترهای را مشخص شده را با کاراکتر های جدید جایگزین می کند.
متد ()Append()/AppendLine
از متد Append
کلاس StringBuilder برای افزودن یا الحاق یک رشته به StringBuilder استفاده می شود. متد ()AppendLine
رشته ای را با یک خط جدید به انتهای رشته StringBuilder می افزاید.
StringBuilder sb = new StringBuilder("Hello ",50);
sb.Append("World!!");
sb.AppendLine("Hello C#!");
sb.AppendLine("This is new line.");
Console.WriteLine(sb);
خروجی :
Hello World!! Hello C#!. This is new line.
نکته : در هنگام الحاق چندین رشته به هم دیگر StringBuilder سریعتر از string عمل میکند. از StringBuilder برای الحاق بیشتر از سه یا چهار رشته به همدیگر استفاده کنید برای الحاق دو یا سه رشته ، string کارایی بیشتری نسبت به StringBuilder دارد.
متد ()AppendFormat
از متد ()AppendFormat
برای فرمت بندی رشته ارسالی و الحاق آن استفاده کنید :
StringBuilder amountMsg = new StringBuilder("Your total amount is ");
amountMsg.AppendFormat("{0:C} ", 25);
Console.WriteLine(amountMsg);
خروجی :
Your total amount is $ 25.00
متد ()Insert
از متد ()Insert
برای درج یک رشته در یک مکان مشخص از StringBuilder استفاده کنید :
StringBuilder sb = new StringBuilder("Hello World!!",50);
sb.Insert(5," C#");
Console.WriteLine(sb);
خروجی :
Hello C# World!!
متد ()Remove
از متد ()Remove
برای حذف رشته از یک مکان مشخص از StringBuilder می توان استفاده کرد
StringBuilder sb = new StringBuilder("Hello World!!",50);
sb.Remove(6, 7);
Console.WriteLine(sb);
خروجی :
Hello
متد ()Replace
از متد ()Replace
می توان برای جایگزینی قسمتی از یک رشته StringBuilder استفاده کرد :
StringBuilder sb = new StringBuilder("Hello World!!",50);
sb.Replace("World", "C#");
Console.WriteLine(sb);
خروجی :
Hello C#!!
استفاده از شاخص ها (Indexer)
می توان از یک شاخص برای به دست آوردن و تنظیم کردن یک کاراکتر در یک مکان مشخص استفاده کرد.در نمونه مثال زیر با استفاده از شاخص و حلقه for تمام کاراکترهای یک رشته بر روی خروجی چاپ می شود.
StringBuilder sb = new StringBuilder("Hello World!!");
for(int i=0; i< sb.Length; i++) Console.Write(sb[i]);
خروجی :
Hello World!!
متد ()ToString
از متد ()ToString
برای بدست آوردن رشته یک StringBuilder می توان استفاده کرد :
StringBuilder sb = new StringBuilder("Hello World!!");
string str = sb.ToString(); // "Hello World!!"
به خاطر داشته باشید که :
- رشته ای که توسط StringBuilder مشخص میشود، تغییر پذیر است
- StringBuilder در هنگامی که میخواهید چندین رشته را به هم الحاق کنید سریعتر از یک string است.
- یک StringBuilder را می توان همانند یک کلاس مقداردهی اولیه کرد.
- از متد ()Append برای افزودن و یا الحاق رشته ها در یک StringBuilder استفاده کنید
- از متد ()ToString برای به دست آوردن رشته StringBuilder استفاده کنید