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 le comportement des chaînes C# semble-t-il contredire la nature de son type de référence ?

Linda Hamilton
Libérer: 2025-01-24 06:56:10
original
659 Les gens l'ont consulté

Why Does C# String Behavior Seem to Contradict Its Reference Type Nature?

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal