8
votes

Passage de string byval dans vb.net et c #

Les chaînes sont donc des types de référence exactement? Ma compréhension est une référence à la chaîne dans le tas est passée même lorsque vous passez la chaîne byval à une méthode.

SOOO ..... P>

Dim myTestValue As String = "NotModified"
TestMethod(myTestValue)
Debug.Print(myTestValue) /* myTestValue = "NotModified" WTF? */

Private Sub TestMethod(ByVal Value As String)
    Value = "test1"
End Sub


5 Réponses :


2
votes

Tous les types, y compris les types de référence, sont passés par valeur par défaut, comme dans votre exemple, ce qui signifie que une copie de la référence est transmise. Donc, donc peu importe quoi, ré-attribuer un objet comme celui-ci n'aurait aucun effet lorsque vous le transmettez par valeur. Vous changez simplement de quoi la copie de les points de référence à. Vous devez explicitement passer par référence pour atteindre ce que vous essayez de faire.

Ce n'est que lorsque vous Modifier Un objet transmis par la valeur peut être vu en dehors de la méthode. Bien sûr, les chaînes sont immuables, cela ne s'applique donc pas vraiment ici.


1 commentaires

Les chaînes sont des références et stockées sur le tas, et non que cela a une incidence sur la question. Il n'y a rien d'exceptionnel à propos des chaînes de la manière dont ils sont stockés, ce qui sont les seuls types de référence qui peuvent également être des littéraux.




8
votes

Les types de référence sont passés "Référence par valeur" dans .NET. Cela signifie que l'attribution d'une valeur différente au paramètre réel ne modifie pas réellement la valeur d'origine (sauf si vous n'utilisez BYREF / REF). Cependant, tout ce que vous faites pour modifier l'objet réel qui est transmis, modifiera l'objet que la méthode d'appel se réfère. Par exemple, envisagez le programme suivant:

// this is compiled into the assembly, and doesn't need to be set at runtime.
const string S1 = "hello"; 
const string S2 = " world"; // likewise
string s = S1;
s = new StringBuilder().Append(s).Append(S2).ToString();


2 commentaires

+1. Les chaînes ne sont pas différentes de ce type d'autre.


@Joel Coehoorn: Merci. Je ne m'attends pas aux gens de votre calibre pour lire le tout. Espérons que c'est assez simple pour être utile au genre de personnes qui posent cette question. N'hésitez pas à éditer des parties que vous pensez être inutilement verbale.



3
votes

Tout est transmis par la valeur que si vous spécifiez le contraire. Lorsque vous passez une chaîne, vous passez en fait une référence par valeur.

Pour les cordes, cela ne fait pas beaucoup de différence, car les chaînes sont immuables. Ce qui signifie que vous ne recevez jamais de modifier la chaîne que vous recevez. Pour d'autres classes, cependant, vous pouvez modifier un objet transmis par la valeur (sauf, comme la chaîne, elle est immuable). Ce que vous ne pouvez pas faire et ce qui passe par référence vous permet de le faire, c'est modifier la variable em> vous passez. P>

Exemple: P>

Public Class Example
    Private Shared Sub ExampleByValue(ByVal arg as String)
        arg = "ByVal args can be modifiable, but can't be replaced."
    End Sub

    Private Shared Sub ExampleByRef(ByRef arg as String)
        arg = "ByRef args can be set to a whole other object, if you want."
    End Sub

    Public Shared Sub Main()
        Dim s as String = ""
        ExampleByValue(s)
        Console.WriteLine(s)  ''// This will print an empty line
        ExampleByRef(s)
        Console.WriteLine(s)  ''// This will print our lesson for today
    End Sub
End Class


0 commentaires

0
votes
  1. Lorsque vous passez la chaîne à la méthode, une copie de la référence est prise. Ainsi, la valeur est une toute nouvelle variable qui arrive à désigner toujours la même chaîne en mémoire.
  2. Le "test" littéral de chaîne est également créé comme objet de type de référence réel. Ce n'est pas seulement une valeur dans votre code source.
  3. Lorsque vous attribuez "test" à la valeur , la référence de votre la variable est mise à jour pour se reporter à "Test" au lieu de la chaîne d'origine. Étant donné que cette référence est juste une copie (comme nous l'avons vu à l'étape 1), la variable myTestvalue

    Vous pouvez mieux comprendre cela en testant sur un type avec une propriété que vous pouvez mettre à jour. Si vous modifiez uniquement la propriété, ce changement est visible en dehors de la fonction. Si vous essayez de remplacer l'objet entier (comme vous le faites avec cette chaîne), cela n'est pas visible en dehors de la fonction.


0 commentaires