در حالت عادی وقتی یک متغیر رو میفرستین به تابع اگر شی از کلاس یا آرایه نباشه بصورت مقدار فرستاده میشه و یک کپی از متغیر گرفته میشه .
یعنی مثلا اگر این تابع شما باشه :
static void foo(int x) { }
و به این شکل صدا زده بشه :
static void Main()
{
int x = 3;
foo(x);
}
این جا هنگام صدا زده شدن تابع مقدار x داخل main به x داخل تابع کپی میشه پس اگر x رو داخل foo عوض کنین مقدار x داخل main عوض نمیشه .
کار ref و out اینه که به جای فرستادن مقدار ; آدرس رو میفرستن به تابع پس اگر تابع به این شکل باشه :
static void foo(ref int x)
{
//dar sorrat avaz kardan x meghdarash dakhele jaiee ke seda zade shode(inja Main) ham avaz mishe
}
static void Main()
{
int x = 10;
foo(ref x);//Address motaghaier x ro befrest be foo
//...
}
فرق ref با out هم اینه که در صورت استفاده از out متغیر حتما باید داخل تابع مورد نظر مقدار بگیره ولی برای ref به این شکل نیست .
2 مثال زیر رو ببینید :
static void foo(ref int x)
{
//agr be x ham meghdar nadim moshkeli nadare
}
static void Main()
{
int x = 10;
foo(ref x);
//...
}
و
static void foo(out int x)
{
x = 4;//hatman x bayad meghdar begire
}
static void Main()
{
int x;//niazi be meghdar avalie nist chon x dakhele foo meghdar migire
foo(out x);
//...
}
این سوال رو هم ببینید در مورد ارسال با آدرس و مقدار هستش( البته در سی پلاس پلاس) ولی خب مفاهیمش به #C هم مربوط هستش .
call by value در مقابل call by refrence