الفرق بين ByRef و ByVal

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

عندما نقوم بانشاء Function جديدة و نعطيها Parametrs جديدة دون تحديد هل هذه البرامترز ستمرر ByVal او ByRef يقوم الفيجوال بيسك تلقائيا بجعلها ByVal …
اذا ما هي حقيقة الفرق بين ByVal و ByRef ؟ قد يقول البعض هذا لا يهمنا اذا أني لم أواجه أية مشكلة باستعمال ByVal … لكن هل فعلا ByVal صالحة في جميع الحالات ؟ لو كانت كذلك فلما اصلا وجود ByRef ؟؟
للاجابة على هذه التساؤلات سنقوم أولا بتعريف كل من ByVal ثم ByRef ثم عمل مثال بسيط لنبين الفرق بينهما تطبيقيا

ByVal : بواسطة هذه ال KeyWord التي تأتي قبل البرامتر في Function معينة :

Public Function Add(ByVal Number1 As Integer,ByVal Number2 As Integer) As Integer

نقوم فقط بتمرير نسخة من المتغيرين Number1 و Number2 أعني بنسخة أن المتغيرين الأساسين الممررين الى ال Funcion Add لن يحدث اي تغيير في المتغيرين الأصلين حتى لو غيرنا في في قيمتهما داخل ال Function Add … يبدو أن كلا مي يبدو غامضا للبعض لذلك سنكتب مثال جد بسيط
لنفرض ان الكود أسفله موجود في ال Click Event الخاصة مثلا ببوتن :

Dim X, Y As Integer
X = 15 : Y = 10
Add(X, Y)

كما تلاحظون أننا مررنا الى الفنكشن Add متغيرين X,Y و بالتالي الفنكشن Add سترجع لنا جمع الرقمين … قد تقول : أوكي وماذا اذا هذا أمر عادي و ال ByVal هنا لن تشكل لنا اي مشكل .
نعم أنا أتفق معك 100/100 ذلك لأننا لم نغير قيم المتغيرين الذين مررناهما بل فقط استعملنا قيمهما لاستخراج قيمة أخرى …
لكن ماذا لو كنا نريد أن نغير قيم المتغيرن الذين مررناهما ؟؟ هل ال ByVal ستنفع ؟؟ أكيد لالالالالالالالالالالالالالالالالالالالالالالا
فلنأخذ كمثال فنكشن بسيطة تقوم بتغيير قيمة X و تعطيها ل Y و تأخذ قيمة Y و تعطيها ل X و ليكن اسمها Swap

Public Function Swap(ByRef X As Integer, ByRef Y As Integer)
Dim Tmp As Integer
Tmp = X
X = Y
Y = Tmp
End Function

و سنقوم باستدعاء هذه الدالة هكذا :

Dim X As Integer = 10
Dim Y As Integer = 20
Msgbox ” X Value = ” & X & VbCrlf & ” Y Value = ” & Y
Swap(X,Y)
Msgbox ” X Value = ” & X & VbCrlf & ” Y Value = ” & Y

ستجد أن نتيجة ال MsgBox اللي قبل استدعاء الدالة Swap ستكون نتيجته

X Value = 10
Y Value = 20

و هذه طبعا هي القيم التي أعطيناها للمتغيرين
لكن ستكتشف أن نتيجة ال MsgBox اللي بعد استدعاء الدالة ستكون كالتالي

X Value = 20
Y Value = 10

هذا لأننا قمنا بتمرير المتغير إلى الفنكشن و جعلناه قابل للتغير من قبل هذه الأخيرة
لكن حاول أن تضع مكان ByRef الكلمة ByVal في الفنكشن Add و ستجد انه لا يحدث اي تغيير لأننا (كما ذكرت سابقا) قمنا فقط بتمرير نسخة من المتغير و بالتالي لن تستطيع تغيير قيمة المتغير الأصلي
على فكرة هذا الفرق موجود حتى في الفيجوال بيسك 6 و المفهوم ذاته موجود في السي ++ و الشارب
أتمنى أن يكون المفهوم قد و صل إليكم
و السلام عليكم

اضف تعليقا

أيوب جمال الادريسي

جميع الدروس