Heim >Backend-Entwicklung >C++ >Warum scheint das Verhalten von C#-Strings im Widerspruch zur Natur des Referenztyps zu stehen?

Warum scheint das Verhalten von C#-Strings im Widerspruch zur Natur des Referenztyps zu stehen?

Linda Hamilton
Linda HamiltonOriginal
2025-01-24 06:56:10664Durchsuche

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

Warum funktionieren C#-Strings in manchen Fällen nicht wie Referenztypen?

Obwohl String in C# als Referenztyp definiert ist, verhält er sich in bestimmten Codeszenarien anders. Betrachten Sie den folgenden Code:

<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>

Die erwartete Ausgabe dieses Codes ist „vor der Übergabe“ und „nach der Übergabe“, was den Referenzcharakter von Zeichenfolgen widerspiegelt. Die tatsächliche Ausgabe besteht jedoch darin, dass beide Zeilen „vorher übergeben“ sind, was darauf hinweist, dass sie als Wert und nicht als Referenz übergeben werden.

Der Grund für diesen Unterschied ist die Art und Weise, wie Referenzen in C# gehandhabt werden. Der String-Typ ist zwar ein Referenztyp, aber wenn eine Referenz als Parameter an eine Methode übergeben wird, wird sie als Wert übergeben. Dies bedeutet, dass eine Kopie der Referenz erstellt wird und nicht eine Referenz auf den Originalwert.

Wenn Sie eine Zeichenfolge als Referenz übergeben möchten, müssen Sie das Schlüsselwort „ref“ verwenden:

<code class="language-csharp">public static void TestI(ref string test)</code>

Dadurch wird sichergestellt, dass die Methode einen Verweis auf die ursprüngliche Zeichenfolge erhält, sodass innerhalb der Methode vorgenommene Änderungen im aufrufenden Code widergespiegelt werden können.

Es ist wichtig, zwischen der Änderung des Werts eines referenzierten Objekts und der Änderung der Referenz selbst zu unterscheiden. Zeichenfolgen sind unveränderlich und können nicht geändert werden, Referenzen können jedoch anderen Zeichenfolgen neu zugewiesen werden.

Zur besseren Veranschaulichung verwenden wir ein anderes Beispiel mit einem veränderlichen Typ, 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>

In diesem Fall lautet die Ausgabe „“ und „modified“, was darauf hinweist, dass in der Methode vorgenommene Änderungen im aufrufenden Code widergespiegelt werden. Dies liegt daran, dass StringBuilder ein veränderlicher Referenztyp ist.

Das obige ist der detaillierte Inhalt vonWarum scheint das Verhalten von C#-Strings im Widerspruch zur Natur des Referenztyps zu stehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn