تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الفرق بين ByVal و ByRef
#1
كاتب الموضوع : Marwan

بسم الله الرحمان الرحيم

في هذا الدرس سنتعرف على الفرق طرق تمرير البيانات بين الاجراءت و التي تتمثل في الأساس في طريقتين :
-التمرير بالقيمة By Value باستخدام ByVal.
-التمرير بالمرجع By Refrence باستخدام ByRef.

عند تمرير قيمة إلى إجراء ما يوجد 4 حالات يمكن أن تصادفنا:
1/ أن يكون المتغير المرسل من النوع ذو القيمة value Type و يكون الاجراء يستقبل بالقيمة ByVal.
2/ أن يكون المتغير المرسل من النوع المرجعي Refrence Type و يكون الاجراء يستقبل بالقيمة ByVal.
3/ أن يكون المتغير المرسل من النوع ذو القيمة value Type و يكون الاجراء يستقبل بالمرجعByRef.
4/ أن يكون المتغير المرسل من النوع المرجعي Refrence Type و يكون الاجراء يستقبل بالمرجع ByRef.

قبل شرح الفرق بين هذه الحالات الأربع يجب أن تعرف أنني عندما أتحدث عن الأنواع ذات القيمة فإني أقصد الأنواع المعرفة من سجلات Structures باستثناء الأنواع الأساسية Primitiv Types (Integer,Double...)، صحيح أنها من الأنواع ذات القيمة إلاّ أنها تختلف قليلا عن الأنواع المعرفة من Structures في ما يخص تمرير البيانات بين الاجراءت.
أما المتغيرات المرجعية فأقصد بها كل المتغيرات المعرفة من الفئات Classes.

1/تمرير متغير من النوع ذو القيمة إالى إجراء يستقبل بالقيمة:
في هذه الحالة يقوم المترجم بنسخ قيمة المتغير المرسل و التعامل مع هذه النسخة الجديدة دون أن يغير شيئا في المتغير الاصلي.

2/تمرير متغير من النوع المرجعي إلى إجراء يستقبل بالقيمة:
في هذه الحالة يقوم المترجم بانشاء مؤشر جديد في القسم Heap يشير إلى نفس الكائن الذي يشير إليه متغير المرسل أي يقوم بانشاء نسخة من المؤشر و ليس الكائن.إذا جعلنا هذا المؤشر الجديد يشير إلى كائن آخر فإن المتغير الأصلي لن يتأثر بهذا بل سيبقى مشيرا إلى نفس الكائن.لكن الاجراء بإمكانه تغيير قيمة الكائن.
الخلاصة: يمكن للاجراء تغيير قيمة الكائن لكن لا يمكنه تغيير الكائن الذي يشير إليه المتغير.

3/تمرير متغير من النوع ذو القيمة إلى إجراء يستقبل بالمرجع:
في هذه الحالة يقوم المترجم بانشاء مؤشر يشير الى الكائن المرسل و يتعامل مع هذا الكائن من خلال هذا المؤشر و ليس مباشرة كما الحال عادة مع المتغيرات ذوات القيمة Value Types. و هنا يحدث ما يسمى بالصندقة Boxing و هي عملية اسناد متغير من النوع ذو القيمة إلى متغير مرجعي و هي عملية بطيئة و يجب تفاديها كل ما أمكن.

4/تمرير متغير من النوع المرجعي إلى اجراء يستقبل بالمرجع:
هنا لا يقوم المترجم بانشاء نسخة من المؤشر إنما يقوم يتعامل مباشرة مع المؤشر المرسل و بذلك يمكنه ليس فقط تغيير قيم الكائن المرسل اليه إنما أيضا يمكنه جعله يشير إلى كائن آخر.

أرجو أن تكون الصورة قد اتضحت و من وجد خطأ فلا يبخل بتصحيحه.
الرد }}}
تم الشكر بواسطة:



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


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