PDA

View Full Version : سوال: میشه دلیل استفاده از پارامترهای ref و out رو توضیح بدید؟



sahel65
دوشنبه 23 اردیبهشت 1392, 08:04 صبح
سلام؛
خوبین؟
امکانش هست بگید چه مواقعی استفاده از پارامترهای ref و out توصیه میشه؟ میشه در این مورد مثال هم بزنید؟
وقتی که میشه با کد نویسی مقادیر اشیاء رو تغییر داد پس چه دلیلی داره که یک متد بتونه آرگومانتها رو تغییر بده؟

zayens
دوشنبه 23 اردیبهشت 1392, 08:47 صبح
توی یه رویداد (یا همون تابع) وقتی پارامترهای ما با ref دریافت میشن متغیرای ما هر تغییری کنن بعد از خروج ازون رویداد تغییراتشون ثبت میشه
به این نگاه کن
public partial class Form1 : Form
{
int a=0;
public Form1()
{
InitializeComponent();
addToa(a);
//چون ریفرنس نیست مقدار متغیر همون صفر خواهد بود
MessageBox.Show(a.ToString());

addToaREF(ref a);
//اینجا چون از ریفرنس متغیر استفاده کردیم مقدارش دیگه شده 200
MessageBox.Show(a.ToString());
}

private void addToa(int a)
{
a = 200;

}
private void addToaREF(ref int a)
{
a = 200;
}

zayens
دوشنبه 23 اردیبهشت 1392, 08:49 صبح
وقتی که میشه با کد نویسی مقادیر اشیاء رو تغییر داد پس چه دلیلی داره که یک متد بتونه آرگومانتها رو تغییر بده؟



منظورتونا نفهمیدم!

مهرداد صفا
دوشنبه 23 اردیبهشت 1392, 11:37 صبح
با سلام.
اول برای آشنایی بیشتر:
وقتی پارامتری به صورت ref به تابه ارسال می شود در واقع آدرس این پارامتر به عنوان آرگومنت تابع در نظر گرفته می شود و آرگومنت اشاره گری است به متغیری که ارسال شده. در این حالت با تغییر هر کدام از این دو دیگری نیز تغییر می کند.
out هم مانند ref عمل می کند با این تفاوت که out میتواند مقدار null را قبول کند که بیشتر زمانی کاربرد دارد که آرگومنت بعد از اجرای تابع مقداری را بر می گرداند.
با این حساب زمانی که ما نیاز داریم در یک تابع بیشتر از یک مقدار را بر گردانیم می توانیم از ref یا همان out استفاده کنیم. برای مثال تابع GetWindowText از توابع api می تواند متن مربوط به یک پنجره را برگرداند، این تابع متن مورد نظر را به صورت out دریافت می کند و متن پنجره را درون پارامتر قرار می دهد و نتیجه اجرای تابع (error) را به عنوان مقدار برگشتی تابع بر می گرداند.
از طرفی استفاده از آرگومنتها به صورت ref و out باعث کم شدن مقدار حافضه مصرفی (به دلیل استفاده از آدرس 4 بایتی به جای متغیر مثلا 16 بایتی یا آرایه n بایتی) و بالا رفتن سرعت و کارایی برنامه می شود.

fakhravari
دوشنبه 23 اردیبهشت 1392, 12:01 عصر
استفاده از this.a :بامزه: