Maison >développement back-end >C++ >Pourquoi le type de référence de chaîne de C# semble-t-il se comporter comme un type valeur lorsqu'il est transmis à une méthode ?
Le type de référence de chaîne en C# contredit-il le comportement du code ?
En C#, les chaînes sont des types référence, comme documenté par MSDN. Cependant, le code suivant soulève un problème déroutant qui semble remettre en question ce concept :
<code class="language-csharp">class Test { public static void Main() { string test = "before passing"; Console.WriteLine(test); TestI(test); Console.WriteLine(test); } public static void TestI(string test) { test = "after passing"; } }</code>
En fonction du comportement des types référence, on pourrait s'attendre à ce que la console affiche "avant de passer" puis "après avoir passé". En effet, la chaîne test
est transmise par référence à la méthode TestI
et toute modification apportée à la chaîne dans cette méthode doit être reflétée à l'appelant.
Cependant, le code aboutit en fait à la sortie : "avant de passer" "avant de passer", ce qui indique que la chaîne est passée par valeur. Ce comportement contredit le type de référence documenté pour les chaînes en C#.
Incompréhension : Passer par référence vs. passer par référence
La confusion vient de la différence subtile entre passer une référence par valeur et passer un objet par référence. En C#, les paramètres sont toujours transmis par valeur, quel que soit leur type de données.
Lorsqu'un type référence est passé à une méthode, la valeur passée est elle-même une référence, d'où le terme "passer par référence". Cependant, cela ne signifie pas que l'objet référencé par la variable est également passé par référence.
Dans l'exemple ci-dessus, la valeur passée à la méthode TestI
est une copie de la référence à la chaîne "avant de passer". Toute modification apportée à cette copie de la référence au sein de la méthode n’affectera pas la référence originale en dehors de la méthode.
Passer référence par référence : mot clé ref
Pour passer réellement un type référence par référence, le mot-clé ref
doit être utilisé. Ce mot-clé indique que le paramètre est une référence à une variable existante et que toute modification apportée au paramètre dans la méthode sera reflétée dans la variable d'origine.
<code class="language-csharp">class Test { public static void Main() { string test = "before passing"; Console.WriteLine(test); TestI(ref test); Console.WriteLine(test); } public static void TestI(ref string test) { test = "after passing"; } }</code>
En incluant le mot-clé ref
, le code s'exécute désormais comme prévu, affichant "avant de passer" et "après avoir passé" car la méthode TestI
modifie la chaîne d'origine référencée par la variable test
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!