تغییرناپذیری (Immutability) و جادوی برابری
همهی ما هر روز با string کار میکنیم، ولی دو تا از بزرگترین رازهای رفتاریش رو میدونید؟ stringها در سیشارپ هم تغییرناپذیرن و هم اپراتور == روشون یه رفتار خاص داره.
درک این دو نکته، دید شما رو به زبان #C و نحوه مدیریت حافظه، عمیقتر میکنه و شما رو به یه توسعهدهنده مسلطتر تبدیل میکنه.
1️⃣ راز اول:
🛡تغییرناپذیری (Immutability):
وقتی یه string میسازید، دیگه هرگز نمیتونید محتوای اون رو در حافظه تغییر بدید. هر عملیاتی که به نظر میاد داره یه string رو عوض میکنه (مثل ToUpper() یا +)، در واقع داره یه string کاملاً جدید در حافظه میسازه و قبلی رو دستنخورده رها میکنه.
مثال:
string s1 = "hello";
// این کد s1 را تغییر نمیدهد!
// بلکه یک رشته جدید ("HELLO") میسازد و در s2 قرار میدهد.
string s2 = s1.ToUpper();
Console.WriteLine($"s1: {s1}"); // خروجی: s1: hello
Console.WriteLine($"s2: {s2}"); // خروجی: s2: HELLO
چرا این ویژگی خوبه؟
این ویژگی باعث میشه کد شما قابل پیشبینیتر، امنتر (به خصوص در محیطهای چندنخی یا Multi-threaded) و بهینهتر باشه، چون کامپایلر میتونه رشتههای یکسان رو در حافظه به اشتراک بذاره (به این کار String Interning میگن).
2️⃣راز دوم:
🎭جادوی برابری (==)
تو پست "تلههای برابری" دیدیم که == روی Reference Typeها، آدرس حافظه رو مقایسه میکنه. string هم یه Reference Type هست، پس چرا این کد true برمیگردونه؟
string a = "test";
string b = "test";
Console.WriteLine(a == b); // خروجی: True! ولی چرا؟
جواب:
چون تیم طراح #C اپراتور == رو برای string به صورت خاص بازنویسی (Overload) کرده. اونها میدونستن که ۹۹٪ مواقع وقتی دو تا رشته رو مقایسه میکنیم، منظورمون مقایسه محتوای اونهاست، نه آدرس حافظهشون. پس این اپراتور رو هوشمند کردن تا کار ما رو راحتتر کنن و جلوی یه باگ رایج رو بگیرن!
این یکی از نمونههای طراحی هوشمندانه در زبان #C هست.
🤔 حرف حساب و تجربه شما
این رفتارهای خاص string، نمونهای عالی از طراحی هوشمندانه در زبان #C هست که هم به کارایی کمک میکنه و هم جلوی خطاهای رایج رو میگیره.
آیا تا حالا به این فکر کرده بودید که وقتی یه رشته رو با + ترکیب میکنید، در واقع دارید رشتههای جدید در حافظه میسازید (که میتونه روی پرفورمنس تاثیر بذاره)؟ یا از رفتار خاص == برای string خبر داشتید؟
🔖 هشتگها :
#CSharp
#String
#BestPractices