بسم الله الرحمن الرحيم
عندما نقوم بانشاء 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 و المفهوم ذاته موجود في السي ++ و الشارب
أتمنى أن يكون المفهوم قد و صل اليكم
و السلام عليكم

