Question

Commutation Byref Byval sur les appels de méthode

J'ai beaucoup de mises en garde soulevé en raison de:

"La conversion implicite de xxxx à aaaa dans la copie de la valeur de 'ByRef paramètre zzzz retour à l'argument."

Mon sentiment est qu'il serait à l'abri de modifier les paramètres de la fonction de byref byval que rien de spécial n'est fait avec le type de référence des pointeurs à l'intérieur de ces méthodes, les types de référence sont simplement utilisées et je pense que le comportement serait exactement la même si en cours d'exécution avec une copie d'un pointeur plutôt que l'original.

Une autre considération est que j'ai deux classes qui héritent d'une classe de base.La même situation se présente dans le byref params sont à l'origine de la conversion implicite de la classe de base la plus étroite de la classe de béton.Encore une fois je ne vois pas de problèmes avec ce code s'exécutant byval soit.

Quelqu'un aurait-il des conseils concernant l'utilisation de paramètres dans les fonctions lorsque vous traitez avec des types de référence?

Certaines des autres choses qui sont actuellement étant passé autour byref dans mon projet de base de données les objets de connexion, c'est à direOracleConnection et SqlConnection.Est-il une bonne raison pour le passage de ces derniers autour de byref?

Exemple 1

La conversion implicite de l '"Objet" à "Entier" dans la copie de la valeur de 'ByRef" du paramètre "valeur" de retour à l'argument.

Code appelant:

cmd = New SqlCommand()

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

Fonction:

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

Exemple 2

La conversion implicite de "Système".Les données.IDataReader' à 'Système.Les données.SqlClient.SqlDataReader " dans la copie de la valeur de 'ByRef' paramètre 'lecteur retour à l'argument correspondant.

Code appelant:

Dim reader As new SqlDataReader

ReleaseReader(reader)

Méthode:

    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
Était-ce utile?

La solution

Lors de la définition d'une méthode dans VB.Net ou C# pour que la matière, que vous devrez passer des paramètres par valeur (ByVal), sauf si vous avez besoin de prendre avantage de ByRef sémantique.Si vous n'êtes pas mettre à zéro la valeur du paramètre dans la méthode, puis définitivement les transformer en ByVal appels.

Si vous êtes à la réinitialisation de la référence, mais pas d'en prendre avantage de l'appel site alors je voudrais écrire une méthode d'assistance qui prend le paramètre ByVal et les appels dans la prise, il ByRef.Cela permettra d'éliminer l'avertissement parce que le code résultant ne sera pas soumis à la réduction des erreurs de conversion.

Par exemple:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top