با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره کامل آموزش #c ، را دنبال می کنند. در قسمت قبلی با enum در زبان برنامه نویسی #C آشنا شدید.در این قسمت شما را با StringBuilder ها در زبان #C در این زبان آشنا خواهیم کرد.
یک رشته غیر قابل تغییر است، یعنی پس از ایجاد یک رشته نمی توان آن تغییر داد. به عنوان مثال، رشته جدید “!!Hello World ” فضای حافظه ای را در پشته اشغال خواهد کرد. حالا با تغییر رشته اولیه “!!Hello World ” به “Hello World! From Tutorials Teacher” به جای اصلاح رشته اولیه در همان آدرس حافظه ، یک رشته جدید را در پشته ایجاد می کند که موجب اشغال حافظه و بوجود آمدن مشکلاتی دیگر خواهد شد.
برای حل این مشکل در زبان #C از StringBuilder استفاده می کنیم .StringBuilder یک شی پویا است که به شما اجازه می دهد تعداد نویسه های موجود در رشته را گسترش دهید. StringBuilder یک شیء جدید را در حافظه ایجاد نمی کند، و به صورت پویا حافظه را به اندازه رشته اصلاح شده گسترش می دهد.
StringBuilder را میتوان همانند کلاس ها استفاده کرد مانند مثال زیر:
1 2 3 4 5 | StringBuilder sb = new StringBuilder(); //or StringBuilder sb = new StringBuilder("Hello World!!"); |
شما می توانید یک مقدار اولیه رشته ای را بهمراه یک مقدار int به سازنده StringBuilder بفرستید .
به عنوان مثال، کد زیر حافظه ۵۰ کاراکتر را به طور پیوسته برای بر روی پشته حافظه اختصاص می دهد. تخصیص حافظه به طور خودکار پس از رسیدن به ظرفیت کامل گسترش می یابد.
1 2 3 4 5 | StringBuilder sb = new StringBuilder(50); //or StringBuilder sb = new StringBuilder("Hello World!!",50); |
توضیحات | نام متد |
مقادیر منتخب را به انتهای StringBuilder فعلی اضافه می کند. در AppendLine ابتدا رشته اضافه میشود و در آخر مکان نما به خط بعدی منتقل می شود. | StringBuilder.Append(valueToAppend) StringBuilder.AppendLine(valueToAppend) |
جایگزینی فرمت مشخص شده در یک رشته با فرمت رشته مورد نظر | StringBuilder.AppendFormat |
یک رشته را در رشته مشخص شده StringBuilder فعلی وارد می کند. | StringBuilder.Insert(index, valueToAppend) |
تعداد مشخصی از کاراکتر ها را از محدوده ای مشخص شده در StringBuilder حذف می کند. | StringBuilder.Remove(int startIndex, int length) |
جایگزینی کاراکترها | StringBuilder.Replace(oldValue, newValue) |
توسط این متدها می توان رشته ای را به رشته ی موجود پیوند زد مانند مثال زیر :
1 2 3 4 5 6 7 | StringBuilder sb = new StringBuilder("Hello ",50); sb.Append("World!!"); sb.AppendLine("Hello C#!"); sb.AppendLine("This is new line."); Console.WriteLine(sb); |
خروجی :
1 2 | Hello World!! Hello C#!. This is new line. |
توجه: StringBuilder هنگام پیوند رشته های چندگانه سریعتر از رشته انجام می شود. اگر میخواهید بیش از سه چهار رشته اضافه کنید، از StringBuilder استفاده کنید. در مقابل برای اضافه کردن دو یا سه رشته بهتر است از همان String استفاده کنید.
از متد AppendFormat برای اضافه کردن رشته ای با فرمت خاص استفاده میکنیم مانند مثال زیر :
1 2 3 4 | StringBuilder amountMsg = new StringBuilder("Your total amount is "); amountMsg.AppendFormat("{0:C} ", 25); Console.WriteLine(amountMsg); |
خروجی:
1 | Your total amount is $ 25.00 |
متد Insert رشته ای را در رشته مشخص شده در StringBuilder وارد می کند . به مثال زیر توجه کنید :
1 2 3 4 | StringBuilder sb = new StringBuilder("Hello World!!",50); sb.Insert(5," C#"); Console.WriteLine(sb); |
خروجی :
1 | Hello C# World!! |
متد Remove رشته ای را از محدوده مشخص شده حذف میکند مانند کدهای زیر :
1 2 3 4 | StringBuilder sb = new StringBuilder("Hello World!!",50); sb.Remove(6, 7); Console.WriteLine(sb); |
خروجی:
1 | Hello |
توسط متد Replace میتوان رشته ای را جایگزین یک رشته خاص در StringBuilder کرد مانند مثال زیر:
1 2 3 4 | StringBuilder sb = new StringBuilder("Hello World!!",50); sb.Replace("World", "C#"); Console.WriteLine(sb); |
خروجی :
1 | Hello C#!! |
همانند String هر کاراکتر در StringBuilder نیز دارای شماره اندیس است ،میتوان با استفاده از یک حلقه for این مثال را پیاده سازی کرد.
1 2 3 4 | StringBuilder sb = new StringBuilder("Hello World!!"); for(int i=0; i< sb.Length; i++) Console.Write(sb[i]); |
خروجی :
1 | Hello World!! |
به صورت پیش فرض نمیتوان رشته داخل StringBuilder را در متغیر نوع String قرار داد ولی توسط این متد میتوانیم ابتدا StringBuilder را به String تبدیل کرده سپس در داخل متغیر نوع رشته قرار دهیم.
1 2 3 | StringBuilder sb = new StringBuilder("Hello World!!"); string str = sb.ToString(); // "Hello World!!" |
خروجی :
1 | Hello World!! |
در این بخش با شی StringBuilder در زبان #C آشنا شدید.
در بخش بعدی شما را با آرایه ها و کاربرد آنها در زبان #C آشنا خواهیم کرد.
Yasse
چطور میشه یک کاراکتر یا قسمی از رشته داخل stringbilder رو جای دیگه مثلا رو یه تکست اکس کپی کرد؟ بدون کپی کردن کل رشته ها
Yasse
کاراکتر یا قسمتی
صادق
سلام.
از متد ToString(startIndex, length) برای کپی کردن بخشی از stringBuilder استفاده میشه.
پارامتر اول ایندکس شروع و پارامتر دوم تعداد کاراکتر های کپی شده هستند.
مثال:
StringBuilder sb = new StringBuilder("Test String");
string test = sb.ToString(5, 6);
Console.WriteLine(test); // String
Yasse
واقعا ممنون بهترین سایت برنامه نویسی که تا حالا دیدم هستید
صادق
خواهش می کنم
Yasse
من الان از to string استفاده کردم فقط بخش ایندکس رو پارامتری کردم
;int i=0 ,j=1
;string a=stringbuilder.to string(i,3)
;string b=stirngbuilder.to string (j,3)
for(u=0 , u.>m ,u++)
{
;r++
;j++
b=stringbuilder.to string(j,3)
{
برای اولی ها اعمال میشه اما برای اونی که داخل چرخه هست ارور میده . چجوری اینو حل کنم؟ با تشکر
jafar_samimi
سلام
string از نوع ارجاعی می باشد(ReferenceType)، بنابراین در هرم(heap) ذخیره می شود نه در پشته (Stack). در تصویر هم به خوبی این مطلب رو نشون دادین ولی
متاسفانه در توضیحات اشتباه نوشته شده و به جای نوشتن هرم (heap)، پشته نوشته شده لطفا اصلاح بفرمائین تا برای کسی در مفاهیم برنامه نویسی مشکلی پیش نیاد.