تبلیغات
تبلیغات

کلمات کلیدی ref و out در سی شارپ

در این مطلب، قصد داریم تا با دو کلیدواژه‌ی کاربردی ref و out آشنا شویم.

به مثال زیر توجه کنید:

در اینجا، متغیر value به داخل متد Test ارسال شده و در داخل این متد که به پارامتر ورودی x تعلق یافته است، مقدار x برابر 20 شده است؛ ولی پس از اجرای این کد، برخلاف انتظاری که شاید داشته باشید، مقدار value در MessageBox، همان 10 خواهد بود! چرا؟! مگر مقدار value پس از ارسال به داخل متد Test، تغییر نیافته است؟!

البته توجه داشته باشید که اگر نام value را به x تغییر دهید نیز تفاوتی ایجاد نخواهد شد و این یک چیز بدیهی است.

اما چرا مقدار value در داخل Test تغییری نکرد؟!
به این دلیل که پس از ارسال به داخل متد، یک کپی از آن ساخته شده و خودش نیست!

کلیدواژه ref

کد بالا را به صورت زیر می‌نویسیم:

چه اتفاقی افتاد؟! فقط یک کلمه‌ی کلیدی ref اضافه شد؟! یعنی قبل از تعریف ورودی x و به هنگام فراخوانی متد، با قرار دادن یک ref مشکل حل شد؟!

بله! در واقع ref، رفرنس (reference = مرجع) یک پارامتر را به داخل یک متدی ارسال می‌کند! و این باعث می‌شود تا ورودی x، به همان چیزی که از بیرون می‌آید اشاره کند! بدین صورت هرتغییری که روی آن صورت گیرد، روی متغیر بیرونی نیز اعمال خواهد شد و البته فضای کمی نیز از مموری گرفته می‌شود! جالب شد نه؟!

کلیدواژه out

out، یک نوع دیگری از ref است! یعنی چه؟!

در واقع out، همان کار ref را انجام می‌دهد؛ با این تفاوت که متغیر ارسالی به داخلی متد در:

  • ref: حتما باید بیرون از متد مقداردهی شده باشد؛ و داخل متد نیز می‌تواند تغییر یابد.
  • out: نمی‌تواند بیرون از متد مقداردهی شود و باید داخل متد حتما مقداردهی شود.

پس کد زیر کامپایل نخواهد شد:

ولی این یکی کامپایل خواهد شد:

کاربرد ref و out در آبجکت‌ها

شاید برای شما نیز سوال شود که پس این ref و out، در ورودی‌هایی که از جنس داده‌های اولیه‌ای مثل int و … نبوده و از جنس آبجکت هستند، به چه کاری می‌آیند؟! چون آبجکت‌ها، متغیرهای ارجاعی هستند و وقتی برای مثال بنویسیم:

در اینجا، car2 به همان car اشاره کرده و از آن کپی نخواهد شد! (علت این امر در مطلب stack و heap توضیح داده شده است)

پس با این اوصاف، کاربرد ref و out روی آبجکت‌ها چیست؟!
به مثال زیر توجه کنید:

برخلاف انتظاری که داریم و می‌خواهیم خروجی زیر دریافت شود:

Unknown Car Fuel = 10

با عرض پوزش، خروجی زیر دریافت خواهد شد:

Hadi Akbarzadeh Car Fuel = 20

و برای حل مشکل، از همان ref یا out و بستگی به شرایطی که داریم استفاده می‌کنیم! به صورت زیر:

بنابراین اگر داخل متدی، آبجکت پارامتری را از ابتدا new کنیم؛ روی بیرونی اعمال نخواهد شد! چون رفرنس جدیدی به آن پارامتر تعلق گرفته است نه مقدار جدیدی! ولی بدون استفاده از ref و out، اگر از آن استفاده کنیم و مقادیر داخل آبجکت را تغییر دهیم، روی بیرونی نیز اعمال خواهد شد.

کانال تلگرام فول کده
تبلیغات

درباره نویسنده

هادی اکبرزاده

[ مدیر فول کده ]

علاقه‌مند به اشتراک‌گذاری اطلاعات در هر زمینه‌ای
برنامه‌نویس فول استک

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

نظرات ثبت شده 2 دیدگاه