تا ۹۰٪ تخفیف در جشنواره زمستانه توسنیسو! تا ۹۰٪ تخفیف در جشنواره زمستانه توسنیسو!
مانده تا پایان تخفیف
مشاهده دوره ها
0

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

با سلام خدمت دوستان عزیز آی تی پرویی. من آخرای آموزش متد های مهندس احمدی بودم که ایشون بحث کلمات کلیدی out و ref رو مطرح کردن. اما من این قسمت رو به خوبی متوجه نشدم.

میخواستم درخواست کنم که دوستان این قسمت رو به صورت ساده توضیح بدن و بعلاوه این اگه ممکنه به این سوالات بنده هم پاسخ بدن، مرسی:

1. کاربرد این کلمات کلیدی چیست و چرا استفاده میشوند؟

2. ما چه نیازی به مقدار دهی یک پارامتر در بدنۀ متد داریم؟

3. تفاوت این دو کلمه کلیدی چیست؟ (در کاربرد)

3. اگر ممکن است در مورد کاربرد کلمه کلیدی ref توضیح دهید. ممنون میشم.

پرسیده شده در 1395/12/27 توسط

8 پاسخ

0

خیلی ممنون :)

درضمن منظورم از متد های آنووید همون متد هایی هست که ووید نیستن (مقدار برمیگردونن) (این اصطلاح رو توی یه کلاسی شنیدم!)

پاسخ در 1395/12/28 توسط
0

واقعا ممنون فقط دو سوال دیگه هم برای من پیش اومد اونم اینه که در مورد تفاوت out و ref فرمودید: "با این تفاوت که پارامترهای out حتماً باید داخل متد مقدار دهی بشن"، خب اوکی اما میخوام بدونم در کاربرد چه تفاوتی دارن؟ یعنی چه جاهایی از out، و چه جاهایی از ref استفاده می کنیم؟

و دوم اینکه آیا از این کلمات کلیدی برای متد های آنووید هم استفاده میکنیم و اصلا برای اونجور متد ها کاربرد دارن؟

پاسخ در 1395/12/28 توسط
1

سلام و عرض ادب،

در مورد سوالی که پرسیدید کد زیر رو در نظر بگیرید:

public void Test(int num)
{
    num = 12;
}

حالا به صورت زیر متد رو فراخوانی می کنیم:

int myNum = 8;
Test(myNum);
Console.WriteLine(myNum);

دستور آخر مقدار 8 رو در خروجی چاپ می کنه، حالا اگه ما پارامتر ورودی متد Test رو به صورت ref تعریف کنیم، با مقدار دهی پارامتر num داخل متد Test، مقدار myNum که قبل از فراخوانی Test تعریف شده تغییر می کنه:

public void Test(ref int num)
{
    num = 12;
}

و فراخوانی متد:

int myNum = 8;
Test(myNum);
Console.WriteLine(myNum);

کد بالا خروجی 12 رو چاپ می کنه، در حقیقت کلمه کلیدی ref به این معنی هست که مقدار متغیری که زمان فراخوانی متد با پارامتر ref استفاده شده در داخل متد قابل تغییر هست. این طور هم میشه گفت: در صورتی که از کلمه کلیدی ref استفاده نکنید، کامپایلر یک مقدار کپی از myNum رو داخل پارامتر num قرار میده و هیچ ارتباطی بین این دو نیست، اما زمان استفاده از کلمه کلیدی ref به جای مقدار، آدرس myNum برای num استفاده میشه و هر تغییرات داخل بدنه متد بر روی پارامتر ref بر روی متغیر اصلی هم اعمال میشه.

در مورد تفاوت ref و out، دقیقاً مشابه همدیگه هستن، با این تفاوت که پارامترهای out حتماً باید داخل متد مقدار دهی بشن، در غیر اینصورت پیغام خطا دریافت می کنید، اما پارامتر های ref اگر مقدار دهی نشن پیغام خطایی دریافت نمی کنید.

یکی از کاربرد های out بازگرداندن چند خروجی از یک متد هست و مثال هم میشه به متد TryParse اشاره کرد، پارامتر اول این متد یک مقدار رشته ای میگیره، پارامتر از نوع int هست که به صورت out تعریف شده و رشته تبدیل شده به عدد داخل اون قرار میگیره و مقدار خروجی این متد هم از نوع bool هست که در صورت موفقیت آمیز بودن تبدیل رشته به عدد مقدار true و در غیر اینصورت مقدار false بر میگردونه:

int num = 0;
if(int.TryParse("12",out num))
{
    Console.WriteLine(num);
}
پاسخ در 1395/12/28 توسط
0

شما برای این کلمه out رو استفاده می کنید تا این اطمینان حاصل بشه حتماً داخل متد پارامتر مقداردهی میشه، ممکنه پارامتری به صورت ref تعریف بشه و اگر داخل متد مقدار دهی نشه برنامه بدون مشکل اجرا میشه، اما کلمه کلیدی out در صورت عدم مقدار دهی پیغام خطا زمان کامپایل ایجاد می کنه و اجازه اجرای برنامه رو نمیده.

مورد آخر هم منظورت رو از «متدهای آنووید» متوجه نشدم!

پاسخ در 1395/12/28 توسط
0

ممنون و متشکر از شما :)

تا اونجایی که من متوجه شدم در واقع از out و ref برای برگرداندن چندین مقدار از یک متد به صورت غیر مستقیم استفاده میشه درسته؟

پاسخ در 1395/12/28 توسط
1

متد TryParse که بالا در موردش مثال زدم مقدار بازگشتی متد bool هست و یک پارامتر out هم داره. پس کاربرد این نوع پارامترها به متدهای void محدود نمیشه.

پاسخ در 1395/12/28 توسط

پاسخ شما