امید احمدپور
امید احمدپور
خواندن ۲ دقیقه·۳ سال پیش

دلیل Immutable بودن String در سی شارپ و بررسی رفتار آن

در دنیای برنامه نویسی از String برای نمایش و ذخیره یک متن استفاده می شود.

در زبان برنامه نویسی سی شارپ، String ها بصورت یک آرایه از کاراکترها هستند که با هم کنار قرار گرفتن این کاراکترها، متن مورد نظر شکل می گیرد.

Immutable String
Immutable String

همچنین در سی شارپ string در دسته reference type ها قرار می گیرد و بر روی heap ذخیره می شود.

در سی شارپ string بصورت immutable پیاده سازی شده است. Immutable به معنی فقط خواندنی است به عبارت دیگر وقتی شما یک متغیر string تعریف و مقداردهی می کنید، دیگر نمی توانید آنرا تغییر دهید.

در سی شارپ، CLR تعیین می کند که string ها کجا ذخیره شوند. موقعی که شما یک متغیر string تعریف می کنید، CLR در پشت صحنه یک آرایه از کاراکترها برای ذخیره مقدار موردنظر تعریف می کند.

همانطور که می دانید هنگام تعریف آرایه ها باید طول آرایه مشخص شود و بعد از تعریف آن، طول آرایه قابل اضافه و کم کردن نیست.

موقعی که شما مقدار string را تغییر می دهد چون مقدار قبلی که یک آرایه از کاراکترها است و قابل تغییر نیست، بنابراین مقدار جدید را در یک آرایه جدید کپی یا Clone می کند و با این کار یک بلوک جدید از خانه های حافظه را به آن اختصاص داده می دهد.
در واقع، هنگامیکه شما مقدار یک string را تغییر می دهید، CLR یک بلوک جدید از خانه های حافظه را به آن اختصاص می دهد.

تغییرناپذیر بودن string، مزایا و معایبی دارد که در ذیل به آن می پردازیم.

مزایای Immutable بودن String:


یکی از مزایای آن thread-safe بودن است. اگر شما در سیستم های multi-threaded کد میزنید، دیگر مشکلات deadlock و همزمانی را نخواهی داشت. بدین معنی که وقتی شما یک string را تغییر می دهید در واقع شما یک آبجکت جدید در حافظه تعریف می کنید.

مزیت دیگر این است که دیگر شما نگران تغییر تصادفی مقدار آنها نخواهی بود و نیاز به اقدامات دیگر که هنگام کار با آبجکت های mutable لازم است، نیست.

معایب Immutable بودن String:


عیب اصلی آن می تواند تغییر های زیاد یک string باشد که موجب اختصاص فضای جدید حافظه می گردد و مشکلات پرفرمنسی به همراه دارد.

نمونه ای از این مشکل را می توانید در قطعه کد زیر ببینید.

Sample Code
Sample Code

همانطور که در قطعه کد بالا که یک برنامه Console است ملاحظه می کنید، در حلقه for به ازای هربار اجرا متغیر myVariable مقدار دهی می شود و پرینت انجام می شود.

تا زمانیکه string در اینجا Immutable باشد به ازای هربار اجرا، CLR مقداری از حافظه را به متغیر جدید اختصاص می دهد و هربار اجرا مقدار بیشتری از حافظه را برای ذخیره مقدار مورد نظر اختصاص می دهد.


* در مقالات بعدی به نکاتی می پردازیم که می تواند هنگام کار با string از این مشکلات جلوگیری شود

* CLR : Common Language Runtime


stringimmutableسی شارپcsharp
NET Backend Developer / Software Engineer and Consultant.
شاید از این پست‌ها خوشتان بیاید