عرشیا دنیابین
عرشیا دنیابین
خواندن ۲ دقیقه·۵ ماه پیش

آیا رشته ReferenceType است ؟

مظلبی که توی این مقاله میخوام در موردش صحبت کنم شاید در نگاه اول مقداری عجیب به نظر برسه اما پیشنهاد میکنم که در خصوصش مقداری تعمل کنید.
به نقل از وبسایت مایکروسافت String در واقع یک Built-in Reference Type هست.
و همونطوری که میدونید C# یک زبان C - Based هست و ما در زبان C چیزی به نام string نداریم.
حالا در سی شارپ ما در واقع آرایه ایی از کرکتر هارو داریم که بهش string میگیم و زیر مجموعه Namespace System.String در .NET هستش یعنی یه جورایی String ماهیت Array گونه دارد. اصلا چرا دارم اینارو میگم ؟
بیاین این کد و باهم ببینیم :

مقدار متغییر str به متود PassByValue پاس داده شده.
مقدار متغییر str به متود PassByValue پاس داده شده.


ما الان اومدیم مقدار یه رشته رو دادیم به یه متودی یه مقداری رو به اون متغییر اضافه کردیم و به عبارتی مقدارش رو تغییر دادیم .. فارغ از اینکه Value Type و Reference Type چیست ؟ (اگر نمیدونید چیست میتونید به این مقاله مراجعه بفرمایید. ) سوال اینجاست که چرا مقدار این متغییر ما تغییر نکرده؟

جالبه که بگیم متغیری از جنس string رفتاری دوگانه دارد چون بعد از تغییر قسمت جدید از حافظه به این متغیر اختصاص داده شده و متغیر قبلی هنوز در حافظه مقدار قبلی خود را حفظ میکند!
( اگر این جمله رو متوجه نمیشوید پیشنهاد میکنم به این مقاله مراجعه کنید.)
چرا این اتفاق میوفته چون در واقع متود بالا داره یه کپی از متغییر رو به متود PassByReference میده !
پس وقتی یه کپی از str به متودمون برسه هر تغییری روش انجام بشه در Scope متود معتبر هست ( خط دوم خروجی ) و پس از تموم شدن متود Dispose شده و از بین میره !
و زمانی که ما مقدار str رو پرینت میگیریم مقدار اولیه ابجکتی که ساخته شده رو بهمون خروجی میده ( خط سوم خروجی )
حالا سوال اینجاست که چطور میتونم مقدار تغییر داده شده رو در متغییر str داشته باشم ؟
به وسیله کلید واژه های out و ref :

اگر بخوایم از کل نکاتی که اشاره کردیم توی یه پاراگراف نتیجه گیری کنیم میگیم که : متغیری از جنس string از نوع Reference Type هاست چون همانطور که میدانید در Heap ذخیره میشود و زمانی که به متودی پاس داده میشود اون متود میتونه مقدار پاس داده شده رو تغییر دهد اما نمیتواند متغییر پاس داده شده رو به مقدار فعلیش Dereference کند چون صرفا یک کپی از اون متغییر رو در اختیار دارد.

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

باشد که رستگار شویم : ))


stringreferencetypedotnetpassbyreference
شاید از این پست‌ها خوشتان بیاید