Maison >développement back-end >C++ >Pourquoi le comportement des chaînes C# semble-t-il contredire la nature de son type de référence ?
Pourquoi les chaînes C# ne fonctionnent-elles pas comme des types de référence dans certains cas ?
Bien que la chaîne soit définie comme un type de référence en C#, elle se comporte différemment dans certains scénarios de code. Considérez le code suivant :
<code class="language-csharp">class Test { public static void Main() { string test = "传递前"; Console.WriteLine(test); TestI(test); Console.WriteLine(test); } public static void TestI(string test) { test = "传递后"; } }</code>
Le résultat attendu de ce code est "avant le passage" et "après le passage", reflétant la nature de référence des chaînes. Cependant, le résultat réel est que les deux lignes sont "passées avant", indiquant qu'elles sont transmises par valeur plutôt que par référence.
La raison de cette différence est la façon dont les références sont gérées en C#. Le type chaîne est bien un type référence, mais lorsqu'une référence est passée en paramètre à une méthode, elle est passée par valeur. Cela signifie qu'une copie de la référence est créée plutôt qu'une référence à la valeur d'origine.
Si vous souhaitez passer une chaîne par référence, vous devez utiliser le mot clé "ref" :
<code class="language-csharp">public static void TestI(ref string test)</code>
Cela garantit que la méthode reçoit une référence à la chaîne d'origine, permettant aux modifications apportées au sein de la méthode d'être reflétées dans le code appelant.
Il est important de faire la distinction entre changer la valeur d'un objet référencé et changer la référence elle-même. Les chaînes sont immuables et ne peuvent pas être modifiées, mais les références peuvent être réaffectées à différentes chaînes.
Pour démontrer plus clairement, utilisons un autre exemple impliquant un type mutable, StringBuilder :
<code class="language-csharp">using System.Text; class Test { public static void Main() { StringBuilder test = new StringBuilder(); Console.WriteLine(test); TestI(test); Console.WriteLine(test); } public static void TestI(StringBuilder test) { test.Append("修改"); } }</code>
Dans ce cas, la sortie sera "" et "modified", ce qui indique que les modifications apportées à la méthode sont reflétées dans le code appelant. En effet, StringBuilder est un type de référence mutable.
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!