كيفية القيام بما يلي: يحمي وسيطة إجراء من تغييرات القيمة

في حالة تعريف الإجراء لمعلمة كـ ByRef في (Visual Basic), يعطي Visual Basic التعليمات البرمجية الخاصة بالإجراء مرجع مباشر إلى عنصر البرمجة الكامن في الوسيطة في التعليمات البرمجية المستدعية. يسمح هذا للإجراء بتغيير القيمة الكامنة في الوسيطة في التعليمات البرمجية المستدعية. في بعض الحالات قد تريد حماية التعليمات البرمجية المستدعية من مثل هذا تغيير.

يمكنك دائماً حماية وسيطة من التغيير بواسطة تعريف المعلمة المطابقة Visual Basic) ByVal) في الإجراء. إذا أردت أن تكون قادراً على تغيير وسيطة معطاة في بعض الحالات دون الأخرى، يمكنك تعريفها ByRef و السماح للتعليمات البرمجية المستدعية تحديد آلية التمرير في كل استدعاء. تقوم بذلك بواسطة إحاطة الوسيطة المطابقة ضمن أقواس لتمريرها بواسطة القيمة، أو عدم تضمينها في أقواس لتمريرها بواسطة المرجع. لمزيد من المعلومات، راجع كيفية القيام بما يلي: فرض على وسيطة ليتم تمريرها حسب القيمة.

مثال

يظهر المثال التالي إجراءان يأخذان متغير صفيف و يعملان على عناصره. الإجراء increase يضيف ببساطة واحد لكل عنصر. يعين الإجراء replace صفيف جديد للمعلمة a() و من ثم يقوم بإضافة واحد لكل عنصر. ومع ذلك، لا يؤثر إعادة التعيين على متغير الصفيف الكامن في التعليمات البرمجية المستدعية.

Public Sub increase(ByVal a() As Long)
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
Public Sub replace(ByVal a() As Long)
    Dim k() As Long = {100, 200, 300}
    a = k
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " & 
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " & 
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))

استدعاء MsgBox الأول يعرض "بعد زيادة(n): 11, 21, 31, 41". لأن الصفيف n من نوع مرجع، replace يمكنه تغيير أعضائه، حتى لو كانت آلية التمرير هي ByVal.

استدعاء MsgBox الثاني يعرض "بعد استبدال(n): 11, 21, 31, 41". لأن n تم تمريره بواسطة ByVal, replace لا يمكنه تعديل المتغير n في التعليمات البرمجية المستدعية عن طريق تعيين صفيف جديد له. عندما تقوم replace بإنشاء مثيل الصفيف الجديد k و تعيّنه للمتغير a المحلي، يفقد المرجع إلى n الذي تم تمريره بواسطة التعليمات البرمجية المستدعية. عندما تقوم بتغيير أعضاء a، يتأثر الصفيف المحلي k فقط. ولذلك، replace لايقوم بزيادة قيم الصفيف n في التعليمات البرمجية المستدعية.

التحويل البرمجي للتعليمات البرمجية

التمرير الافتراضي في Visual Basic هو تمرير وسيطة بواسطة قيمة. ومع ذلك، تضمين إما الكلمة الأساسية Visual Basic) ByVal) أو ByRef في (Visual Basic) مع كل معلمة مُعلَنة هو تدريب برمجي جيد. هذا يجعل تعليماتك البرمجية أسهل في القراءة.

راجع أيضًا:

المهام

كيفية القيام بما يلي: تمرير الوسيطات إلى إجراء

كيفية القيام بما يلي: تغيير قيمة وسيطة الإجراء

كيفية القيام بما يلي: فرض على وسيطة ليتم تمريرها حسب القيمة

المبادئ

الـإجراءات في Visual Basic

معلمات إجراء و وسيطات

تمرير الوسائط بواسطة القيمة و بواسطة المرجع

الفروق بين الوسيطات القابلة للتعديل و الغير قابلة للتعديل

الفروق بين تمرير الوسيطة على حسب القيمة و حسب المرجع

تمرير الوسائط حسب الموضع و حسب الاسم

موارد أخرى

تطبيق نوع البيانات