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 :
Tous les types, y compris les types de référence, sont passés Ce n'est que lorsque vous
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.
Vous passez une copie non la référence réelle. P>
Lire cet article de Microsoft P>
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();
+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.
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
la valeur code> est une toute nouvelle variable qui arrive à désigner toujours la même chaîne en mémoire. LI>
- Le
"test" code> 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. LI>
- Lorsque vous attribuez
"test" code> à la valeur code>, la référence de votre code> la variable code> est mise à jour pour se reporter à "Test" code> 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 code> myTestvalue MyTestValue en dehors de la fonction reste inchangée et fait toujours référence à la chaîne d'origine. LI>
ol>
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. P>
Je recommande de lire cet article: yoda.arachsysys.com/cshaarp/parameters.htmlled/a > et les réponses aux questions en double.
Wow, je ne comprends pas cela du tout. Comment fonctionner
myTestvalue code> peut-être changer du tout? Ce n'est pas modifié? Comment pensez-vous que vous le modifiez?
@Stan: les gens très (très) mélangent souvent des transactions pass-référence et passent un Type de référence i> Valeur.