PDA

View Full Version : کاربرد out در ورودی یک تابع



once4ever
جمعه 16 شهریور 1386, 20:49 عصر
در دو کد زیر یک اتفاق میافته:

public void FillData(DataTable table){
...
}

public void FillData(out DataTable table){
...
}
در هردو table پر میشه و بعد از اون table قابل استفاده هست.
دلیل اینکه پرسیدم اینه که چندتا کلاس مختلف داشتم و از حالت اول استفاده کردم اما دیگه table پر نبود. ولی با حالت دوم کار کرد

gomnam
جمعه 16 شهریور 1386, 20:58 عصر
در دو کد زیر یک اتفاق میافته:

public void FillData(DataTable table){
...
}

public void FillData(out DataTable table){
...
}
در هردو table پر میشه و بعد از اون table قابل استفاده هست.
دلیل اینکه پرسیدم اینه که چندتا کلاس مختلف داشتم و از حالت اول استفاده کردم اما دیگه table پر نبود. ولی با حالت دوم کار کرد

out کاربرد های زیادی داره
مثلا اگه قرار باشه یک متد بیش از یه مقدار برگردونه (مثلا 2 مقدار) آنگاه یکی از پرارمترها با دستور return و دیگری با out مقدار دهی میشوند

برای تعداد پارامتر باز گشتی دیگه هم همینطوره

همچنین یکی دیگه از کاربرد هاش اینه که وقتی متغیری را درون یه متد تعریف کردین و اونو به هر دلیلی نمیخواین مقدار اولیه بهش بدین و همینطور نیاز دارین که متغیر مذکور را به متد دیگری پاس دهید از out باید استفاده کنی وگرنه خطای معروف با اینکه متغیر مقدار دهی نشده را دریافت خواهید کرد

توی msdn هم که ......

once4ever
جمعه 16 شهریور 1386, 21:05 عصر
ممنون شما به درست بعضی کاربردهای out گفتید اما منظور من موردی بود که تو سوالم مطرح کرده بودم. یعنی تفاوت اون دو شکل دستور و اینکه واقعا باهم فرق دارند اما چرا؟

توی msdn هم که ......

BeyondMicrosoft
جمعه 16 شهریور 1386, 21:17 عصر
با سلام
همانطور که می دانید کلاسها در #C به روش ارجاع به متد ارسال می شوند و اگر تغییری در شیی که به عنوان پارامتر ارسال شده ایجاد شود، شیی که به عنوان آرگمان ارسال شده نیز تغییر می کند چون به یک جا اشاره می کنند. و ساختارها (structure ها) عکس کلاس ها به روش مقدار ارسال می شوند. حال اگر بخواهیم ساختاری را به روش ارجا ارسال نماییم از کلمه کلیدی ref استفاده می کنیم حال ممکنه آرگمانی را که می خواهیم ارسال کنیم مقدار اولیه به آن نداده باشیم کامپایلر خطا میگیره حال اگر بخواهیم پارامتری که ارسال می کنیم به روش ارجاع باشه و مقدار اولیه نداشته باشه بعد توی تابع به آن مقدار بدهیم از کلمه کلیدی out استفاده می کنیم.
این مورد در کلاسها نیز صادق است.
امیدوارم جوابتان را گرفته باشید
(تا پست را گزاشتم دیدم یک کاربر دیگر جواب گزاشته و شما هم پست دیگری گزاشتید. بعد دیگه پست را پاک نکردم تا شاید برای دیگران مفید باشد)
موفق باشید.

PC2st
شنبه 17 شهریور 1386, 00:23 صبح
یادمه که در جایی خوندم:
out سرعت بیشتر به نسبت ref و حالت معمولی (by val) داره، چون شرط وجود مقدار اولیه برای پارامتر، مورد بررسی قرار نمیگیره.