Maison > développement back-end > C++ > Pourquoi la modification d'une chaîne dans une méthode C# ne modifie-t-elle pas la chaîne d'origine ?

Pourquoi la modification d'une chaîne dans une méthode C# ne modifie-t-elle pas la chaîne d'origine ?

Patricia Arquette
Libérer: 2025-01-24 07:11:09
original
181 Les gens l'ont consulté

Why Doesn't Modifying a String in a C# Method Change the Original String?

Compréhension approfondie du transfert de chaînes en C#

Les chaînes en C# sont des types référence, mais cela conduit souvent à des malentendus. Cet article approfondira les subtilités du passage de chaînes et expliquera pourquoi le code suivant ne se comporte pas comme prévu :

<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

Bien que la chaîne soit un type référence, la deuxième sortie de ce code n'a pas changé. Cela est dû à la distinction entre passer des références par valeur et passer des objets par référence.

Passer une référence par valeur signifie copier la référence elle-même, toute modification à l'intérieur de la méthode n'affectera pas la variable d'origine. Passer un objet par référence modifiera la référence elle-même et les modifications au sein de la méthode seront reflétées dans la variable d'origine.

Pour que les chaînes fonctionnent comme prévu, elles doivent être passées par référence (en utilisant le mot-clé ref) :

<code class="language-csharp">using System;

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

La sortie du code modifié est la suivante :

<code>输入:before passing
输出:after passing</code>
Copier après la connexion

Ce n'est pas la même chose que modifier l'objet sous-jacent. Les chaînes en C# sont immuables et leur contenu ne peut pas être modifié. Cependant, on peut passer un objet par référence (ex : StringBuilder) et modifier ses données :

<code class="language-csharp">using System;
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" 参数的值。
        // 我们改变的是它所引用的对象中的数据。
        test.Append("changing");
    }
}</code>
Copier après la connexion

La sortie de ce code est :

<code>输入:
输出:changing</code>
Copier après la connexion

En résumé, comprendre la différence entre passer une référence par valeur et passer un objet par référence est crucial pour travailler avec des chaînes en C#. En adoptant des méthodes appropriées, le comportement attendu du code peut être obtenu.

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