إجراءات استكشاف الأخطاء وإصلاحها

تسرد هذه الصفحة بعض المشاكل الشائعة التي تحدث عند العمل مع الإجراءات.

ارجاع نوع الصفيف من دالة الإجراء

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

Function allOnes(ByVal n As Integer) As Integer()

For i As Integer = 1 To n - 1

' The following statement generates a COMPILER ERROR.

allOnes(i) = 1

Next i

' The following statement generates a COMPILER ERROR.

Return allOnes()

End Function

العبارة allOnes(i) = 1 يقوم بإنشاء خطأ في المحول البرمجي لأنه يظهر أنه يستدعي allOnes مع وسيطة من نوع البيانات الخاطئة (فردية Integer بدلاً من الصفيف Integer ). العبارة Return allOnes() يقوم بإنشاء خطأ في المحول برمجي لأنه يظهر أنه يستدعي allOnes مع عدم توفر أية وسيطات.

المنهج الصحيح: لتكون قادراً على تعديل عناصر الصفيف التي يتم إرجاعها، عرّف صفيف داخلي كمتغير محلي. المثال التالي يحول برمجيًا بدون أخطاء.

Function allOnes(ByVal n As Integer) As Integer()
    Dim i As Integer, iArray(n) As Integer
    For i = 0 To n - 1
        iArray(i) = 1
    Next i
    Return iArray
End Function

الوسيطة التي لا يتم تعديلها بواسطة استدعاء الإجراء

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

  • المتغير الأساسي. للسماح للإجراء باستبدال قيمة عنصر المتغير الأساسي نفسها، الإجراء أن يقوم بتعريف المعلمة ByRef في (Visual Basic). أيضاً، استدعاء التعليمات البرمجية يجب أن لا يحيط الوسيطة بالأقواس، لأنها قد يمنع آلية التمرير ByRef.

  • عناصر نوع المرجع. إذا قمت بتعريف معلمة Visual Basic) ByVal)، الإجراء لا يمكنه تعديل عنصر المتغير الأساسي نفسه. ومع ذلك، إذا كانت وسيطة نوع المرجع, الإجراء يمكنه تعديل أعضاء الكائن حيث يشير إليه، بالرغم من أنه لا يمكن استبدال قيمة المتغير. على سبيل المثال، إذا كانت الوسيطة متغير صفيف، الإجراء لا يمكنه تعيين صفيف جديدة له، ولكن يمكنها تغيير واحد أو أكثر من عناصرها. العناصر المتغيرة منعكسه في متغير الصفيف الأساسي في استدعاء التعليمات البرمجية.

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

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

المثال التالي يقوم باستدعاء increase و replace.

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 نوع المرجع increase يمكنها تغيير أعضاءها على الرغم من أن تم تمريرها ByVal.

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

المنهج الصحيح: حتى تتمكن من تعديل عنصر المتغير المصدر نفسه، قم بتمريرها حسب المرجع. يظهر المثال التالي التغيير في تعريف replace التي تسمح باستبدل صفيف واحد بأخرى في استدعاء التعليمات البرمجية.

Public Sub replace(ByRef a() As Long)

غير قادر على تعريف التحميل الزائد

إذا أردت تعريف إصدار محمل بشكل زائد من إجراء، يجب استخدام نفس الاسم ولكن بتوقيع مختلف. إذا كان المحول البرمجي لا يستطيع تمييز التعريف من التحميل الزائد مع نفس التوقيع, فإنه يقوم بإنشاء خطأ.

توقيع الإجراء يتم فرضها بواسطة اسم الإجراء و قائمة المعلمة. يجب أن يكون لدى كل تحميل زائد نفس اسم مثل كل التحميل الظائد الأخرى لكن يجب أن تختلف جميعاً في المكونات التوقيع الأخرى على الأقل. لمزيد من المعلومات، راجع زيادة تحميل الإجراء.

العناصر التالية حتى ولو كانت تتعلق بقائمة المعلمة ، ليست من مكونات توقيع أحد الإجراءات:

  • الكلمات الأساسية لمعدلات الإجراء، مثل Public, Shared ،و Static.

  • اسم المُعامِل

  • الكلمات الأساسية لمعدلات المعلمة، مثل ByRef و Optional.

  • نوع بيانات قيمة الإرجاع (ماعدا لعامل التحويل)

لا يمكنك تحميل الإجراء الزائد بواسطة التباين فقط أو أكثر من العناصر السابقة.

المنهج الصحيح: لتتمكن إلى تعريف التحميل الزائد إجراء, يجب أن تختلف توقيع. لأنه يجب استخدام نفس الاسم يجب أن تختلف أنواع رقم أو ترتيب بيانات من معلمات. عدد نوع الإجراء عام معلمات يمكن أن يختلف . في عامل تشغيل تحويل (دالة CType) ، يمكن أن يختلف نوع الإرجاع.

دقة التحميل الزائد مع الاختيارية و وسيطات ParamArray

إذا تم الزائد إجراء مع واحد أو أكثر من (Visual Basic) اختيارية معلمات أو ParamArray (Visual Basic) معلمة، يجب تجنب تكرار أي من تساعد الضمني. لمزيد من المعلومات، راجع اعتبارات في إجراءات التحميل الزائد.

إصدار خاطئ من استدعاء إجراء محمل زائد

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

عند تحديد التحميل الزائد التي تريد استدعاء ، كن حذراً لمراقبة القواعد التالية:

  • توفير رقم صحيح من الوسيطات و بالترتيب الصحيح.

  • وبشكل مثالي، يجب أن يكون لديك وسائط بالضبط أنواع بيانات نفسها كمعلمات المطابق. في أي حالة نوع البيانات من كل وسيطة يجب توسيع إلى التي معلمة المقابل الخاص به. يكون هذا صحيحاً حتى مع كشف الخيار الصارمِ تعيين إلى Off. إذا تطلب التحميل الزائد أي تحويل تضييقي من جهاز وسيطة القائمة، هذا التحميل الزائد غير مؤهل باستدعاء.

  • إذا قمت بتزويد الوسيطات التي تتطلب التوسيع تأكد أنّ أنواع البيانات الخاصة بها قريب قدر الإمكان لأنواع بيانات المعلمة المطابقة. إذا كان اثنين أو أكثر من التحميل الزائد تقبل أنواع بيانات الوسيطة الخاصة بك، يحل المحول البرمجي الخاص بك التحميل الزائد وذلك عندما يستدعي لمدة أقل من التوسيع.

يمكنك تقليل فرص عدم التطابق نوع بيانات باستخدام الكلمة الأساسية دالة CType تحويل عند تحضير الوسائط الخاص بك.

زيادة التحميل فشل دقة

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

يوضح المثال التالي عملية حل التحميل الزائد.

Overloads Sub z(ByVal x As Byte, ByVal y As Double)
End Sub
Overloads Sub z(ByVal x As Short, ByVal y As Single)
End Sub
Overloads Sub z(ByVal x As Integer, ByVal y As Single)
End Sub
Dim r, s As Short
Call z(r, s)
Dim p As Byte, q As Short
' The following statement causes an overload resolution error.
Call z(p, q)

في الاتصال الأول، يحل المحول البرمجي التحميل الزائد الأول لأن نوع الوسيطة الأولى (Short) تضيق الى نوع المعلمة المطابقة (Byte). فإنه فيما بعد ينهي التحميل الزائد الثالث لأن كل نوع وسيطة في التحميل الزائد الثاني ( Short و Single) يوسع إلى النوع المطابق في التحميل الزائد الثالث (Integer و Single). التحميل الزائد الثاني يتطلب أقل توسيع, بحيث يستخدم المحول البرمجي فوقه للحصول يتصل.

في الإستدعاء الثانية, لا يمكن إزالة المحول البرمجي أي تساعد أساس من تضييق. فإنه يحل التحميل الزائد الثالث للسبب نفسها كما في أول يتصل ، لأنه يمكن يتصل التحميل الزائد الثاني مع توسيع أقل من أنواع وسيطة. ومع ذلك، لا يمكن حل المحول البرمجي بين تساعد أول والثاني. الـكل لديه نوع معلمة معرفة واحدة التي توسع الى النوع المقابل في الأخرى (Byte إلى Short، ولكن Single إلى Double). ولهذا يقوم المحول البرمجي بإنشاء خطأ دقة التحميل الزائد.

المنهج الصحيح: لتكون قادراً على يتصل إجراء overloaded بدون الغموض الاستخدام دالة CType مطابقة أنواع بيانات وسيطة إلى أنواع المعلمات. المثال التالي يتصل إلى z التي يفرض دقة إلى التحميل الزائد الثاني.

Call z(CType(p, Short), CType(q, Single))

دقة التحميل الزائد مع الاختيارية و وسيطات ParamArray

إذا كان لدى جهازي تساعد إجراء التواقيع متطابقة إلا أنه تم تعريف معلمة الأخيرة (Visual Basic) اختيارية في أحد و ParamArray (Visual Basic) الأخرى، يحل المحول البرمجي يتصل لإجراء استناداً إلى أقرب تطابق لها. لمزيد من المعلومات، راجع دقة التحميل الزائد.

راجع أيضًا:

المبادئ

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

إجراءات فرعية

إجراءات الدالة

إجراءات الخاصية

إجراءات عامل التشغيل

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

زيادة تحميل الإجراء

اعتبارات في إجراءات التحميل الزائد

دقة التحميل الزائد