مشاهده نسخه کامل
: چرا رشته ها غیرقابل تغیرند؟!
سلام
چرا رشته ها immutable هستند و ما توسط تابع reverse نمیتوانیم آنها را برعکس کنیم؟
و چرا آرایه ای از کارکتر ها را میتوانیم؟
اگر رشته ها در حافظه Heap هستند و اشاره گر آنها در استک برای آرایه مگر این طور نیست؟
چرا باید حتما اول تبدیل به آرایه ای از کارکتر ها بکنیمشون بعد برعکس کنیم؟!
سلام
همانطورکه قبلاً در تاپیک زیر هم اشاره شد:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
String ها class هایی هستند که طوری طراحی شده اند تا فقط readonly باشند.
دلیلش هم بسیار واضح است.
بدلیل بازدهی حجم بالایی که میتوانند داشته باشند و نیز بدلیل ابعاد متغییری که دارند باید در هیپ باشند.
و این یعنی عدم کپی در نقل و انتقالات.
دستورات زیر را در نظر بگیرید:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در اینجا من چهار بار از str استفاده کردم در همه آنها فقط یک عدد نقطه ram وجود دارد!
#C در پسضمینه فقط عدد نقطه ram را کپی کرده!
اگر برنامه نویس اجازه داشته باشد، مستقیم آن نقطه ram را ویرایش کند، میدانید چه فاجعه ای در برنامه رخ میدهد! حدس بزنید!!!
در مثال بالا چهار کلاسی که این مقدار را دریافت کرده اند بدون آنکه متوجه شوند، محتویات کپسوله شده داخلشان تغییر میکند، بدون آنکه مطلع شوند و خودشان را refresh کندو.
اگر نقطه ram را مستقیم ویرایش کنید، Text دکمه تغییر میکند بدون آنکه دکمه مطلع شود و خودش را مجدد ترسیم کند.
حتی SortedDictionary هم فرصتی برای sort مجدد اطلاعات نخواهد داشت...
...
اگر دقیق فکر کنید، عواقبش غیر قابل پیش بینی خواهد بود!
=====
خلاصه:
کلاس string حالت readonly دارد تا در نقل و انتقالات هزینه کپی شدن مجدد اطلاعات (هم ram ای و هم cpu ای پرداخت نشود) در عوض در هر تغییری لازم است که (برای خراب نشدن سایر کپی های نامحدود داخل حافظه حتماً) نسخه جدیدی ساخته شود.
این یک روش استاندارد است و در نوع خود بهترین شیوه ممکن است و مختص #C نیست.
اگر string ای میخواهید که راحت در همه توابع مدام تغییرش دهید و هزینه ساخت مجدد را ندهید، کافیست بجای string از []char استفاده کنید.
موفق باشید.
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.