تبلیغات :
خرید لپ تاپ استوک
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




نمايش نتايج 1 به 2 از 2

نام تاپيک: چرا رشته ها غیرقابل تغیرند؟!

  1. #1
    آخر فروم باز
    تاريخ عضويت
    Jul 2009
    پست ها
    6,351

    14 چرا رشته ها غیرقابل تغیرند؟!

    سلام
    چرا رشته ها immutable هستند و ما توسط تابع reverse نمیتوانیم آنها را برعکس کنیم؟
    و چرا آرایه ای از کارکتر ها را میتوانیم؟
    اگر رشته ها در حافظه Heap هستند و اشاره گر آنها در استک برای آرایه مگر این طور نیست؟
    چرا باید حتما اول تبدیل به آرایه ای از کارکتر ها بکنیمشون بعد برعکس کنیم؟!

  2. #2
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    همانطورکه قبلاً در تاپیک زیر هم اشاره شد:
    [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
    String ها class هایی هستند که طوری طراحی شده اند تا فقط readonly باشند.

    دلیلش هم بسیار واضح است.
    بدلیل بازدهی حجم بالایی که میتوانند داشته باشند و نیز بدلیل ابعاد متغییری که دارند باید در هیپ باشند.
    و این یعنی عدم کپی در نقل و انتقالات.

    دستورات زیر را در نظر بگیرید:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    در اینجا من چهار بار از str استفاده کردم در همه آنها فقط یک عدد نقطه ram وجود دارد!
    #C در پسضمینه فقط عدد نقطه ram را کپی کرده!

    اگر برنامه نویس اجازه داشته باشد، مستقیم آن نقطه ram را ویرایش کند، میدانید چه فاجعه ای در برنامه رخ میدهد! حدس بزنید!!!

    در مثال بالا چهار کلاسی که این مقدار را دریافت کرده اند بدون آنکه متوجه شوند، محتویات کپسوله شده داخلشان تغییر میکند، بدون آنکه مطلع شوند و خودشان را refresh کندو.

    اگر نقطه ram را مستقیم ویرایش کنید، Text دکمه تغییر میکند بدون آنکه دکمه مطلع شود و خودش را مجدد ترسیم کند.
    حتی SortedDictionary هم فرصتی برای sort مجدد اطلاعات نخواهد داشت...
    ...
    اگر دقیق فکر کنید، عواقبش غیر قابل پیش بینی خواهد بود!

    =====

    خلاصه:
    کلاس string حالت readonly دارد تا در نقل و انتقالات هزینه کپی شدن مجدد اطلاعات (هم ram ای و هم cpu ای پرداخت نشود) در عوض در هر تغییری لازم است که (برای خراب نشدن سایر کپی های نامحدود داخل حافظه حتماً) نسخه جدیدی ساخته شود.
    این یک روش استاندارد است و در نوع خود بهترین شیوه ممکن است و مختص #C نیست.
    اگر string ای میخواهید که راحت در همه توابع مدام تغییرش دهید و هزینه ساخت مجدد را ندهید، کافیست بجای string از []char استفاده کنید.

    موفق باشید.

  3. این کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده است


Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •