out چکار میکنه و فرقش با ref چیه ؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

out چکار میکنه و فرقش با ref چیه ؟

+3 امتیاز

لطفا کد زیر رو توضیح بدین که out چه کار میکنه و اصلا چی هست؟ و با ref چه فرقی داره؟


static void Main(string[] args)
        {

            int x ;
            int y = func( out x);
            Console.WriteLine("x=" + x + "y=" + y);
            Console.ReadLine();



            Console.ReadKey();

        }
         static  int func( out int a)
        {
            a = 10;
            a++;
            return a;
        }
سوال شده تیر 1, 1393  بوسیله ی daniyaltjm (امتیاز 840)   47 88 103
دوباره تگ گذاری شد تیر 16, 1393 بوسیله ی BlueBlade

3 پاسخ

+3 امتیاز
 
بهترین پاسخ

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

یعنی مثلا اگر این تابع شما باشه :

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

پاسخ داده شده تیر 1, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد تیر 1, 1393 بوسیله ی daniyaltjm
+2 امتیاز
سلام

با اجازه منم یکم اطلاعات اضافه کنم

ref رفرنس و مرجع متغییر رو میفرسته به تابع درصورتی که out برای بازگشت مقدار خصوصا در برنامه های سرویس گیرنده سرویس دهنده بهینه شده
پاسخ داده شده تیر 1, 1393 بوسیله ی alixw24 (امتیاز 656)   2 5 13
+2 امتیاز
سلام

با اجازه دوستان منم یه اشاره ای داشته باشم
ref برای ارجاع به کار میره و out برای مقدار دهی البته out هم به صورت ارجاع هستش

 out ما هستیم و متغیر ظرف !! همونطور که یک ظرفی درون حوض آب میبریم و ازش آب بر میدارم، اینجا هم به همون ترتیب out متغیر رو مثل یه ظرف درون تابع میبره و ازش مقدار برمیداره.
پاسخ داده شده تیر 11, 1393 بوسیله ی امیدوار (امتیاز 872)   21 63 76
ویرایش شده تیر 12, 1393 بوسیله ی امیدوار
...