تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
ref vs out in c#.net
#1
بسم الله الرحمن الرحيم
((رب اشرح لي صدري ويسر لي امري واحلل عقدة من لساني يفقهوا قولي))

ref vs out in c#.net

كلاهما عبارة عن كلمات محجوزة في لغة C# دورها ارسال التغير الحاصل على المتغير في الدالة الفرعية الى المتغير في الدالة الرئيسية حيث توجد هنالك طريقتان لتمرير البيانات عبر الدوال وهي:

1- Pass by reference.
2- Pass by value.

وهذه الطريقة تسمى بــ pass by reference أي باستخدام (ref and out).

لكن توجد بعض الفروقات في عمل هاتين الكلمتين نوجزها كما يلي:

1-
out: لا يفترض أو ليس بالضرورة اسناد قيمة أولية للمتغير الذي سنمرره للدالة كــ  out argument.
ref: يجب اسناد قيمة أولية للمتغير الذي سنمرره للدالة كــ ref argument.

2-
out: يجب اسناد قيمة للباراميتر المُمَرَّر للدالة كــ out parameter في الدالة الفرعية وإلا سينتج خطأ.
ref: لا يجب اسناد قيمة للباراميتر المُمَرَّر للدالة كــ ref parameter في الدالة الفرعية.


3-
out: أكثر فائدة واستخداما في حال كان المطلوب ارجاع اكثر من قيمة.
ref: اكثر فائدة في حال كان المطلوب تعديل أو تغيير قيمة أو محتوى المتغير داخل الدالة الفرعية.

4-
out: يعمل باتجاه واحد فقط، أيّ ان التغير الحاصل على المتغير سيأتي من الدالة الفرعية، بمعنى سيتم ارسال المتغير فقط بدون البيانات وسيتم جلب البيانات من الدالة الفرعية. حتى وإن تم اسناد المتغير بقيمة أولية فهنا سيتم تجاهل القيمة الاولية لانه كما ذكرنا سابقا بأن اسناد القيمة الجديدة ستكون في الدالة الفرعية.
ref: يعمل باتجاهين، أيّ أنك تستطيع أن تمرر بيانات الى الدالة الفرعية وجلب البيانات المعدلة منها، بمعنى آخر أنك ستقوم بارسال متغير مع البيانات وستقوم باسترجاع البيانات المعدلة من الدالة الفرعية.

مخطط يوضح النقطة الاخيرة بين ref and out
[صورة مرفقة: 150063905565691.png]

مثال يبيّن الفرق بين ref and out:

PHP كود :
using static System.Console;

namespace 
refandout
{
 
   class Program
    
{
 
       static void Main(string[] args)
 
       {
 
           MethodOut(out int output);// inline out vars in c# 7.0
 
           WriteLine(output);
 
           
            int y 
6;// ref must be initialized with any value
 
           MethodRef(ref y);
 
           WriteLine(y);
 
           ReadKey();
 
       }

 
       private static void MethodOut(out int x)
 
       {
 
           // out must be assigned to a value
 
           //x = x + 5;//compile time erorr: x must be assigned to a value
 
           x 5;
 
           x += 4;
 
       }

 
       private static void MethodRef(ref int y)
 
       {
 
           y 5;
 
       }
 
   }


والحمد لله رب العالمين
الرد
تم الشكر بواسطة: sendbad100 , sendbad100 , Amir_Alzubidy , ابو ليلى
#2
الحمد لله رب العالمين
الحمد لله الذي تتم بنعمته الصالحات
جزاك الله خير اخي سجاد
الرد
تم الشكر بواسطة: Sajad , Sajad , ابو ليلى , ابو ليلى


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم