سؤال

تحويل Byref إلى Byval على مكالمات الطريقة

لدي العديد من التحذيرات التي أثيرت بسبب:

"التحويل الضمني من xxxx إلى Yyyy في نسخ قيمة المعلمة" Byref "ZZZZ إلى وسيطة المطابقة."

شعوري هو أنه سيكون من الآمن تغيير معلمات الوظيفة من BYREF إلى BYVAL لأنه لا يوجد شيء خاص مع مؤشرات النوع المرجعي داخل هذه الطرق ، يتم استخدام الأنواع المرجعية ببساطة وأعتقد أن السلوك سيكون هو نفسه تمامًا إذا كان يعمل مع نسخة مؤشر وليس الأصلي.

اعتبار آخر هو أن لدي فئتان ترث من فئة قاعدة. يحدث نفس الموقف من حيث أن معاملات BYREF تسبب صب ضمني من الفئة الأساسية إلى فئة الخرسانة الأضيق. مرة أخرى ، لا يمكنني رؤية أي مشاكل في هذا الرمز الذي يعمل بيفال أيضًا.

هل لدى أي شخص أي نصائح بشأن استخدام المعلمات في الوظائف عند التعامل مع أنواع المرجعية؟

بعض الأشياء الأخرى التي يتم تمريرها حاليًا حول Byref في مشروعي هي كائنات اتصال قاعدة البيانات ، أي OracleConnection و SQLConnection. هل هناك أي سبب وجيه لتمرير هذه حول Byref؟

مثال 1

التحويل الضمني من "كائن" إلى "عدد صحيح" في نسخ قيمة "قيمة المعلمة" BYREF "إلى الوسيطة المطابقة.

رمز الاتصال:

cmd = New SqlCommand()

cmd.Parameters.Add(CreateParameter("Alpha", SqlDbType.Int,ParameterDirection.Input, -1, AlphaValue))

وظيفة:

Private Function CreateParameter(ByVal parameterName As String, ByVal dbType As SqlDbType, ByVal direction As ParameterDirection, ByVal size As Integer, ByRef value As Object) As SqlParameter
    Dim retParam As SqlParameter
    retParam = New SqlParameter(parameterName, dbType)
    retParam.Direction = direction
    retParam.Size = size
    retParam.Value = value
    Return retParam
End Function

مثال 2

التحويل الضمني من "system.data.idatareader" إلى "system.data.sqlclient.sqldatareader" في نسخ قيمة "المعلمة BYREF" "قارئ" إلى الوسيطة المطابقة.

رمز الاتصال:

Dim reader As new SqlDataReader

ReleaseReader(reader)

طريقة:

    Public Sub ReleaseReader(ByRef reader As IDataReader)
        If reader IsNot Nothing Then
            If Not reader.IsClosed Then
                reader.Close()
            End If
            reader.Dispose()
        End If
    End Sub
هل كانت مفيدة؟

المحلول

عند تحديد طريقة في vb.net ، أو c# لهذه المسألة ، يجب عليك تمرير المعلمات حسب القيمة (byval) ما لم تكن بحاجة إلى الاستفادة من دلالات BYRE. إذا لم تقم بإعادة ضبط قيمة المعلمة ضمن الطريقة ، فمن المؤكد أن تحويلها إلى مكالمات BYVAL.

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

علي سبيل المثال:

Public Sub ExampleMethod(ByRef p1 As Object) 
  p1 = "foo"
End Sub

Public Sub ExampleMethodWrapper(ByVal p1 as Object)
  ExampleMethod(p1)
End Sub 

Public Sub Test()
  Dim v1 As String = "hello"
  Dim v2 As String = "world" 
  ExampleMethod(v1) ' Warning generated
  ExampleMethodWrapper(v2) ' No warning
End Sub
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top