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

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

اختلافات

عند تمرير وسيطة إلى إجراء، إنتبه إلى بعض الفوارق التي تتفاعل مع بعضها:

  • ما إذا كان عنصر البرمجية الكامن قابل للتعديل أو لا

  • ما إذا كانت الوسيطة نفسها قابلة للتعديل أو لا

  • ما إذا كانت الوسيطة يتم تمريرها بواسطة قيمة أو بواسطة مرجع

  • ما إذا كان نوع بيانات الوسيطة هو نوع قيمة أو نوع مرجع

للمزيد من المعلومات، راجع الفروق بين الوسيطات القابلة للتعديل و الغير قابلة للتعديل والفروق بين تمرير الوسيطة على حسب القيمة و حسب المرجع.

خيار ألية التمرير

يجب أن تختار ألية التمرير بعناية لكل وسيطة.

  • حماية. في عملية الإختيار بين أليتي التمرير، المعيار الأهم هو تعرض المتغيرات المستدعيه للتغيير. ميزة تمرير وسيطة بواسطة ByRef هو أن الإجراء يمكنه إرجاع قيمة إلى التعليمات البرمجية المستدعيه من خلال تلك الوسيطة. ميزة تمرير وسيطة بواسطة ByVal هو أنه يحمي المتغير من أن يتم تغييره بواسطة الإجراء.

  • الأداء. على الرغم من أن ألية التمرير يمكنها التأثير على أداء التعليمات البرمجية الخاصة بك، الاختلافات عادةً عديمة الأهمية. استثناء واحد لهذا هو نوع قيمة يتم تمريره بـByVal. في هذه الحالة، يقوم Visual Basic بنسخ كامل محتوى بيانات الوسيطة. ولذلك، لنوع بيانات كبير مثل بنية، يمكن أن يكون من الفعال أكثر تمريره بواسطة ByRef.

    لأنواع المرجع، يتم نسخ فقط المؤشر إلى البيانات ( أربع بايت على الأنظمة الأساسية ذات 32-bit، ثمانية بايت على الأنظمة الأساسية ذات 64-bit). ولذلك، يمكنك تمرير وسائط من نوع String أو Object بواسطة تمرير بواسطة قيمة دون التأثير سلباً على الأداء.

تحديد ألية التمرير

تعريف الإجراء يحدد ألية التمرير لكل معلمة. لايمكن للتعليمات البرمجية المستدعيه تجاوز ألية ByVal، لكن إذا تم تعريف معلمة بواسطة ByRef, يمكن للتعليمات البرمجية المستدعيه فرض الألية على ByVal بإحاطة اسم الوسيطة بأقواس في الاستدعاء.

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

متى تمرر وسيطة بواسطة قيمة

  • إذا كان عنصر التعليمات البرمجية المستدعيه الكامن في الوسيطة عنصر غير قابل للتعديل، قم بتعريف المعلمة Visual Basic) ByVal) المناظرة. لايمكن لأي تعليمات برمجية أن تغير قيمة عنصر غير قابل للتعديل.

  • إذا كان العنصر الكامن قابل للتعديل، لكنك لاتريد أن يكون الإجراء قادر على تغيير قيمته، قم بتعريف المعلمة ByVal. يمكن فقط للتعليمات البرمجية المستدعيه تغيير قيمة عنصر قابل للتعديل تم تمريره بواسطة قيمة.

متى تمرر وسيطة بواسطة مرجع

  • إذا كان للإجراء حاجة حقيقية لتغيير العنصر الكامن في التعليمات البرمجية المستدعيه، قم بتعريف المعلمة ByRef في (Visual Basic) المناظرة.

  • إذا كان التنفيذ الصحيح للتعليمات البرمجية يعتمد على تغيير الإجراء للعنصر الكامن في التعليمات البرمجية المستدعيه، قم بتعريف المعلمة ByRef. إذا قمت بتمريره بواسطة القيمة، أو إذا تجاوزت التعليمات البرمجية ألية التمرير ByRef بإحاطة الوسيطة بأقواس، قد ينتج استدعاء الإجراء نتائج غير متوقعة.

المثال

الوصف

يوضح المثال التالي متى تمرر الوسائط بواسطة قيمة و متى تمررها بواسطة مرجع. إجراء Calculate له كلا المعلمتين ByVal و ByRef. بإعطاء سعر الفائدة rate, و مبلغ من المال debt، مهمة الإجراء هي حساب قيمة جديدة لـdebt الذي هو نتيجة لتطبيق سعر الفائدة إلى القيمة الأصلية لـdebt. لأن debt هو معلمة ByRef، ينعكس المجموع الجديد في قيمة الوسيطة التعليمات البرمجية المستدعيه التي تناظر debt. معلمة rate هي معلمة ByVal لأنه لايجب أن تغير Calculate قيمتها.

الرمز

Module Module1

    Sub Main()
        ' Two interest rates are declared, one a constant and one a 
        ' variable.
        Const highRate As Double = 12.5
        Dim lowRate = highRate * 0.6

        Dim initialDebt = 4999.99
        ' Make a copy of the original value of the debt.
        Dim debtWithInterest = initialDebt

        ' Calculate the total debt with the high interest rate applied.
        ' Argument highRate is a constant, which is appropriate for a 
        ' ByVal parameter. Argument debtWithInterest must be a variable
        ' because the procedure will change its value to the calculated
        ' total with interest applied.
        Calculate(highRate, debtWithInterest)
        ' Format the result to represent currency, and display it.
        Dim debtString = Format(debtWithInterest, "C")
        Console.WriteLine("What I owe with high interest: " & debtString)

        ' Repeat the process with lowRate. Argument lowRate is not a 
        ' constant, but the ByVal parameter protects it from accidental
        ' or intentional change by the procedure. 

        ' Set debtWithInterest back to the original value.
        debtWithInterest = initialDebt
        Calculate(lowRate, debtWithInterest)
        debtString = Format(debtWithInterest, "C")
        Console.WriteLine("What I owe with low interest:  " & debtString)
    End Sub

    ' Parameter rate is a ByVal parameter because the procedure should
    ' not change the value of the corresponding argument in the 
    ' calling code. 

    ' The calculated value of the debt parameter, however, should be
    ' reflected in the value of the corresponding argument in the 
    ' calling code. Therefore, it must be declared ByRef. 
    Sub Calculate(ByVal rate As Double, ByRef debt As Double)
        debt = debt + (debt * rate / 100)
    End Sub

End Module

راجع أيضًا:

المهام

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

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

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

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

المبادئ

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

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

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

موارد أخرى

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