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

تفاوت ارسال Value و Reference در #C

در این مقاله میخوایم بررسی کنیم که چه تفاوتی بین ارسال به صورت Value و Reference به عنوان پارامتر ورودی متد در #C وجود داره.

بیایین اول با یه مثال شروع بکنیم.

و همونطوری که انتظار داریم خروجی :

حالا اگر من به ورودی متد ref اضافه بکنم چه اتفاقی میوفته؟

خروجی به صورت زیر میشه:

اما چه اتفاقی افتاد؟

در مثال اول به علت اینکه متغییر age از جنس int هست و int هم جز Value Type ها و در قسمت Stack حافظه ذخیره میشه.

پس وقتی ما اون رو به ورودی یک متد پاس میدیم دقیقا Value اون در Stack ارسال میشه و هر تغییری که روی اون بدیم فقط در Local Scope متد اعمال میشه و هیچ تاثیری روی Outer Scope متد نمیذاره.

اما در مثال دوم ما از کلمه کلیدی ‍‍ref در ورودی متد و هنگام Call کردن متد قرار دادیم. این کلمه کلیدی همونجوری که از اسمش ممکنه حدس بزنید Reference اون متغییر رو ارسال میکنه. پس هر تغییری داخل متد بدیم مستقیما روی Value اون متغییر تاثیر میذاره و خروجی متفاوت میشه.

پس ما هر وقت بخوایم یک متغییر به صورت By Reference تغییر بکنه میتونیم از ref استفاده بکنیم.

بریم ببینیم در Reference Type ها مثل کلاس ها به چه صورت هست.

این ۲ تا مثال زیر رو ببینید.

مثال سوم:

مثال چهارم:

و خروجی هر ۲ تا:

اما چرا خروجی هر دو یکی شد؟

کلاس ها چون از جنس Object هستند و Object ها هم در فضای Heap ذخیره میشه و صرفا Pointer اون در Stack هست و وقتی ما اون هارو به ورودی متد پاس میدیم به صورت پیش فرض By Reference پاس داده میشوند و گذاشتن کلمه کلیدی ref تاثیری ندارد.

اما ما میتونیم کاری کنیم که در داخل متد هر اتفاقی افتاد روی متغییر Outer Scope تاثیری نذاره.

برای این کار فقط کافیه داخل متد ما متغییر رو برابر با Instance جدید از همون کلاس قرار بدیم:

و خروجی:

امیدوارم این مطلب براتون مفید بوده باشه و هر سوالی داشتید کامنت بذارید.


منابع:

1 - StackOverflow

2 - Pluralsight

3 - Microsoft

csharpnetnet coreASP.NET COREارسال value reference
شاید از این پست‌ها خوشتان بیاید