You are currently viewing فرق ref و out در C#

اول ببینیم هرکدوم اینا به تنهایی چه کاربردی دارن. اگه پارامتر ورودی یه تابعی به شکل ref دریافت بشه، آدرس اون متغیر برای تابع ارسال میشه نه مقدارش

و اگه پارامتر ورودی یه تابعی به شکل out دریافت بشه، علاوه بر اینکه آدرس اون متغیر ارسال میشه، باید حتما مقداردهی اولیه بکنیمش وگرنه کامپایل ارور میگیریم.

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

void multiply(int number)
{
    number *= 2;
}

void add(ref int number)
{
    number += 1;
}

void subtract(out int number)
{
    number = 5;
    number -= 1;
}

int age = 10;

multiply(age);
Console.WriteLine(age);

add(ref age);
Console.WriteLine(age);

subtract(out age);
Console.WriteLine(age);

یه متغیر به اسم age تعریف کردم و مقدار اولیشو دادم 10

تابع multiply رو صدا میزنم و age رو بهش میدم. تو تابع مقدار عددمون رو 2 برابر میکنم اما تو خروجی 10 چاپ میشه. چون مقدار age برای تابع multiply ارسال شده و اگه داخل تابع مقدار رو تغییر بدیم، فقط داخل تابع تاثیرش باقی می‌مونه.

حالا تابع add رو اجرا میکنم و age رو به صورت ref بهش میدم. اینبار آدرس age برای تابع ارسال میشه. داخل تابع عددم رو بعلاوه 1 میکنم و در خروجی می‌بینیم که 11 چاپ میشه. چون آدرس age ارسال شده و تغییرات روش اعمال میشه

در آخر تابع out رو اجرا میکنم و age رو به صورت out بهش میدم. داخل تابع کامپایلر مجبورم میکنه اول عدد دریافتی رو مقدار دهی کنم و بعد ازش استفاده کنم و من هم این کارو میکنم و مقدار 5 بهش میدم. بعد هم یکی ازش کم میکنم و در خروجی برام عدد 4 چاپ میشه

فرق ref و out

درسته هردوی اینها آدرس متغیر رو ارسال میکنن ولی ref دوطرفه هست اما out یک طرفه. یعنی ref مقدار قبلی متغیر رو هم دریافت میکنه اما out کاری به مقدار قبلی نداره و دوباره مقداردهیش میکنه و طبیعتا مقدار قبلی پاک میشه.

پس زمانی از out استفاده کنین که مقدار اولیه اون براتون مهم نیست و فقط میخواین نتیجه یه کار یا پردازشی رو داخلش بریزین.

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