Exception de type de référence de chaîne C#
La documentation C# indique que les chaînes sont des types référence. Cependant, le code ci-dessous présente un comportement déroutant :
<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>
Selon la définition du type référence, la sortie doit être "avant passage" et "après passage", ce qui indique que la chaîne a été modifiée dans la méthode TestI. Cependant, le résultat réel est « avant de passer » et « avant de passer », ce qui indique que la chaîne est passée par valeur plutôt que par référence.
Pour comprendre cette exception, nous devons nous plonger dans les subtilités des types de référence. Bien que les chaînes soient techniquement des types référence, les références elles-mêmes sont transmises par valeur. Passer une référence par valeur signifie que la variable contenant la référence est copiée, pas l'objet lui-même. Par conséquent, toute modification apportée à la référence à l’intérieur de la méthode n’affectera pas la chaîne d’origine en dehors de la méthode.
Pour corriger cela et permettre la modification de la chaîne, il faut passer référence par référence à l'aide du mot clé "ref" :
<code class="language-csharp">public static void TestI(ref string test)</code>
Toute modification apportée à la référence à l'intérieur de la méthode TestI sera désormais reflétée dans la chaîne d'origine en dehors de la méthode.
Il est important de noter la différence entre changer l'objet auquel une variable fait référence et changer la référence elle-même. Les chaînes sont immuables, ce qui signifie que leur contenu ne peut pas être modifié. Cependant, nous pouvons réaffecter la variable de référence pour qu'elle pointe vers une chaîne différente, comme le montre l'exemple StringBuilder suivant :
<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("changing"); } }</code>
Dans cet exemple, au lieu de changer la valeur du paramètre "test", nous modifions les données dans l'objet auquel il fait référence.
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!