মূল পার্থক্য
StringBuilder = Mutable (পরিবর্তনশীল)
String = Immutable (অপরিবর্তনশীল)
Immutable মানে কী?
string অবজেক্ট একবার তৈরি হলে তার মান পরিবর্তন করা যায় না। যেকোনো মডিফিকেশন (Concatenate, Replace, Substring) নতুন অবজেক্ট তৈরি করে মেমরিতে। পুরানো অবজেক্ট গার্বেজ কালেক্টরের জন্য ছেড়ে দেয়া হয়।
Mutable মানে কী?
StringBuilder একটি বাফার মেইনটেইন করে। Append, Insert, Replace, Remove অপারেশন এতে একই মেমরি লোকেশন-এ আপডেট হয়। নতুন অবজেক্ট তৈরি হয় না।
উদাহরণ: পারফরম্যান্স তুলনা
using System;
using System.Text;
using System.Diagnostics;
class DemoApplication {
public static void Main() {
const int iterations = 10000;
// String - প্রতিবার নতুন অবজেক্ট
var sw1 = Stopwatch.StartNew();
string str = "Hello";
for (int i = 0; i < iterations; i++) {
str += " World"; // নতুন string অবজেক্ট
}
sw1.Stop();
Console.WriteLine($"String: {sw1.ElapsedMilliseconds} ms");
// StringBuilder - একই বাফার
var sw2 = Stopwatch.StartNew();
var sb = new StringBuilder("Hello");
for (int i = 0; i < iterations; i++) {
sb.Append(" World");
}
sw2.Stop();
Console.WriteLine($"StringBuilder: {sw2.ElapsedMilliseconds} ms");
// ফাইনাল রেজাল্ট
Console.WriteLine($"String length: {str.Length}");
Console.WriteLine($"StringBuilder length: {sb.Length}");
}
}
সামान्य আউটপুট (১০,০০০ ইটারেশন):
String: 45 ms StringBuilder: 2 ms
কেন StringBuilder দ্রুত?
- মেমরি রি-অ্যালোকেশন ও কপি নেই
- ইন্টারনাল বাফার ডাইনামিক্যালি বৃদ্ধি পায় (ডিফল্ট ক্যাপাসিটি ১৬, ডাবল হয়ে যায়)
- গার্বেজ কালেক্টরের চাপ কম
কোনটি কখন ব্যবহার করবেন?
| পরিস্থিতি | সুপারিশ |
|---|---|
| কয়েকটি স্ট্রিং কনক্যাট (২-৫) | string বা string.Concat / + অপারেটর |
| লুপে/রিকার্সিভলি বড় স্ট্রিং বিল্ড | StringBuilder |
| ফরম্যাটিং (String.Format, Interpolation) | string (রানটাইমে StringBuilder ব্যবহার করে) |
| থ্রেড-সেফ्टी দরকার | string (ইনমিউটেবল = থ্রেড-সেফ) |
| Dictionary key, HashSet | string (ইনমিউটেবল = হ্যাশ কোড স্থির) |