PDA

View Full Version : گفتگو: حبث کنیم راجع به ref و out



Hoseein.S
پنج شنبه 22 تیر 1391, 17:22 عصر
با سلام و خسته نباشید خدمت همه دوستان عزیز
می خواستم یه بحثی راجع به out و ref داشته باشیم
همان طور که می دانید دو روش برای ارسال ارگومان ها به متدها در زبان های برنامه نویسی وجود دارد :
1.by value(ارسال با مقدار )
2.by reference(ارسال با مرجع)
من میخواهم درباره ارسال با مرجع در c# بحث کنیم
در تعریفی ساده:
در ارسال با مرجع ( ادرس متغییر ) وقتی ما از ref استفاده میکنیم باید حتما مقدار اولیه داشته باشد ولی در ارسال با out مقدار اولیه مهم نیست .
نمی خواهم از تعاریف اصولی استفاده کنم ولی در مجموع ایا فرق بین این دو همین است

Hoseein.S
پنج شنبه 22 تیر 1391, 19:48 عصر
اگر هم کسی راجع به امنیت در استفاده از ref و out دارد بحث کنیم

the king
پنج شنبه 22 تیر 1391, 21:04 عصر
با سلام و خسته نباشید خدمت همه دوستان عزیز
می خواستم یه بحثی راجع به out و ref داشته باشیم
همان طور که می دانید دو روش برای ارسال ارگومان ها به متدها در زبان های برنامه نویسی وجود دارد :
1.by value(ارسال با مقدار )
2.by reference(ارسال با مرجع)
من میخواهم درباره ارسال با مرجع در C#‎‎ بحث کنیم
در تعریفی ساده:
در ارسال با مرجع ( ادرس متغییر ) وقتی ما از ref استفاده میکنیم باید حتما مقدار اولیه داشته باشد ولی در ارسال با out مقدار اولیه مهم نیست .
نمی خواهم از تعاریف اصولی استفاده کنم ولی در مجموع ایا فرق بین این دو همین است


پارامتری که با ref به متد تحویل داده میشه هم برای خواندن و هم نوشتن قابل دسترسی یه، هم میشه مقدار قبلی اش رو خواند و هم مقدار اش رو تغییر داد (نه به عنوان یک متغیر محلی).
شما باید مقدار اولیه اش را قبل از اینکه به متد ارسالش کنید مشخص کرده باشید و همچنین مجبور نیستید که مقدارش رو داخل متد تغییر بدهید، می توانید به حال خودش رهایش کنید.

اما پارامتری که با out به متد تحویل داده میشه، دسترسی اش صرفا برای نوشتنه، اگر چیزی ازش بخوانید همان مقداری است که داخل متد می نویسید، وگرنه قبل از آنکه داخلش بنویسید
قابل خواندن نیست. قبل از اینکه به متد ارسالش کنید چه مقداری برایش تعیین کرده باشید و چه نکرده باشید، مقدار مورد نظر قابل دسترسی نیست.
همچنین مجبور هستید که داخل متد مقدارش را مشخص کنید، نمی توانید به حال خودش رهایش کنید.

Hoseein.S
جمعه 23 تیر 1391, 00:28 صبح
اولا ممنون از پاسخت ولی به نظر من تفاوت ها بیشتر از این هاست چون microsoft نمیاد برای یک مقدار اولیه یه key word اضافه کنه
و توی کتاب ها یی مثل wrox و apress از ref به عنوان reference parameter و از out به عنوان output parameter ولی در توضیحاتشون فقط به مقدار اولیه اشاره کردن اگر به مطلبی جدید برخوردید خوشحال میشم در میان بگذارید

tooraj_azizi_1035
جمعه 23 تیر 1391, 15:36 عصر
سلام

ref:
باعث میشه آرگومان ها با ارجاع به متد پاس داده بشن یعنی به جای مقدار آدرس اونها به متد پاس داده میشه. تاثیرش هم اینه که هر تغییری رو پارامتر روی متغیر اولیه تاثیر میگذاره. و باید هم در هنگام تعریف متد و هم در هنگام ارسال ref رو ذکر کنی.

class RefExample
{
static void Method(ref int i)
{
i = 44;
}
static void Main()
{
int val = 0;
Method(ref val);
// val is now 44
}
}


آرگومان ارسالی به عنوان ref باید ابتدا initialize شود. و در این حالت با آرگومان نوع out که نیازی به مقداردهی اولیه ندارد فرق دارد.

صرف وجود out و ref نمی تواند دلیل وجود اختلاف بین دو متد باشد بنابراین خطای زیر در هنگام کامپایل داده بوجود می آید:


class CS0663_Example
{
// compiler error CS0663: "cannot define overloaded
// methods that differ only on ref and out"
public void SampleMethod(ref int i) { }
public void SampleMethod(out int i) { }
}



اما حالت زیر قابل قبول است:


class RefOutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}



out:

باعث میشه آدرس آرگومان به متد ارسال بشه. و در این حالت به ref برابر است اما اختلافش این هست که ref نیاز داره متغیر قبل از ارسال مقداردهی اولیه بشه.

مانند ref در out هم هر دوی متد و فراخواننده باید علناً out رو ذکر کنند:


class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void Main()
{
int value;
Method(out value);
// value is now 44
}
}



class OutReturnExample
{
static void Method(out int i, out string s1, out string s2)
{
i = 44;
s1 = "I've been returned";
s2 = null;
}
static void Main()
{
int value;
string str1, str2;
Method(out value, out str1, out str2);
// value is now 44
// str1 is now "I've been returned"
// str2 is (still) null;
}
}



بیشتر:
http://msdn.microsoft.com/en-US/library/t3c3bfhx%28v=vs.80%29