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 ?

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 ?

DDD
Libérer: 2025-01-24 07:06:10
original
635 Les gens l'ont consulté

Why Does C#'s String Reference Type Seem to Behave Like a Value Type When Passed to a Method?

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

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

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal