تبديل Byref إلى Byval على Method Calls Vb.net
سؤال
تحويل 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