VB.NET: Si je passe une Chaîne ByVal dans une fonction mais ne modifie pas la chaîne, puis-je avoir un ou deux chaînes dans la mémoire?
Je sais que les chaînes sont immuables, de sorte que la minute vous modifiez une chaîne de référence de la valeur .NET, une marque nouvelle chaîne sur le tas.
Mais que faire si vous n'avez pas changement la valeur d'une chaîne de référence; plutôt, il vous suffit de passer dans une fonction ByVal
-- est-ce que cette opération de copier la chaîne de valeur sur le tas? Mon inclination est "non", mais je tiens à confirmer.
Par exemple:
Public Function IsStringHello(ByVal test As String) As Boolean
Return (String.Compare(test, "Hello") = 0)
End Function
Programme appelant:
Dim myWord as String = "Blah"
Dim matchesHello as Boolean = IsStringHello(myWord)
Je sais passant myWord
par la valeur d'une copie de la référence de "Bla", mais depuis je n'ai pas essayé de changer la chaîne elle-même, serait-il faire une autre copie de la chaîne sur le tas?
Pourquoi comparer des chaînes dans ce drôle de façon ... stackoverflow.com/questions/859005/...
L'Aide De La Chaîne.Comparer vous permet de spécifier la sensibilité de cas. Cela pourrait être plus claire que uppercasing chaînes avant de les comparer.
L'Aide De La Chaîne.Comparer vous permet de spécifier la sensibilité de cas. Cela pourrait être plus claire que uppercasing chaînes avant de les comparer.
OriginalL'auteur Rob Sobers | 2009-06-26
Vous devez vous connecter pour publier un commentaire.
Par la voie, chaîne de stage est complètement étrangère. La règle pour le passage de paramètres à des fonctions est la même pour tous les types de référence (et vraiment, toutes les catégories), peu importe comment ils sont gérés à l'interne.
La règle est simple et vous l'avez dit il correctement: le passage par valeur des copies de la référence, pas la cible. Aucun espace de tas est copié ici.
Ah droite. J'ai vidé la déclaration.
OriginalL'auteur Konrad Rudolph
Pas. il utilise toujours le copie de la référence à la "Blah".
Ce qui fait de vous le pensez, ça va?
Sur une note de côté, la chaîne sont internés.
s & t, les deux se réfèrent à la même chaîne (car il est interné). Si vous modifiez s ou t, il va créer une nouvelle chaîne, puis.
String constantes sont internés. Les chaînes que vous créez dans les autres moyens ne sont pas internés.
ahhh...donc dans shahkalpesh la réponse ci-dessus où nous attribuer deux références à la même chaîne littérale ne signifie pas qu'ils se réfèrent à la même chaîne sur le tas?
si string s = "bonjour"; string t = "ello"; string z = "h" + t; ne s & point z à la même instance?
que signifie par internedf?
OriginalL'auteur shahkalpesh
Passant des objets ByVal crée une copie de la pointeur, et non pas l'objet lui-même. Voici une démonstration:
Sortie de ce programme suivantes:
Donc, la chaîne d'origine et la chaîne nous sommes passés par valeur existent à la même adresse dans l'adresse de mémoire. Vous n'êtes pas de faire une copie de la chaîne elle-même.
OriginalL'auteur Juliet
Est court, non. Il passe une référence à la chaîne. Une seule instance de la chaîne elle-même.
OriginalL'auteur Scott Weinstein
string est un type de référence. Si vous passez par valeur, ce que vous êtes de passage est la valeur de la référence.
La seule façon, vous obtiendrez une autre copie sur le tas, il conviendrait de modifier la valeur de la variable.
OriginalL'auteur jlembke
Une variable de type
System.String
effectivement un "object-ID". Supposons queObject #1934
est une chaîne avec des caractères"Blah"
, et vous direDim myWord As String = "Blah"
. Le compilateur va ensuite stockerObject #1934
enmyWord
. L'appel deIsStringHello(myWord)
serait alors la cause que la fonction est appelée avec sontest
paramètre égal àObject #1934
. Dans votre exemple, il y aurait deux variables de typeSystem.String
dans la mémoire--myWord
ettest
, et à la fois tenir le contenuObject #1934
.OriginalL'auteur supercat