Heim > Backend-Entwicklung > C++ > Warum scheint das C#-String-Verhalten der Referenztypklassifizierung zu widersprechen?

Warum scheint das C#-String-Verhalten der Referenztypklassifizierung zu widersprechen?

Linda Hamilton
Freigeben: 2025-01-24 07:16:09
Original
434 Leute haben es durchsucht

Why Does C# String Behavior Seem to Contradict its Reference Type Classification?

C#-String-Ausnahme „Referenztyp“

In der C#-Dokumentation heißt es, dass Strings Referenztypen sind. Der folgende Code zeigt jedoch ein verwirrendes Verhalten:

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";
    }
}
Nach dem Login kopieren

Gemäß der Definition des Referenztyps sollte die Ausgabe „vor der Übergabe“ und „nach der Übergabe“ erfolgen, was darauf hinweist, dass die Zeichenfolge in der TestI-Methode geändert wurde. Die eigentliche Ausgabe lautet jedoch „before pass“ und „before pass“, was darauf hinweist, dass die Zeichenfolge als Wert und nicht als Referenz übergeben wird.

Um diese Ausnahme zu verstehen, müssen wir uns mit den Feinheiten von Referenztypen befassen. Obwohl Zeichenfolgen technisch gesehen Referenztypen sind, werden die Referenzen selbst als Wert übergeben. Die Übergabe einer Referenz als Wert bedeutet, dass die Variable, die die Referenz enthält, kopiert wird, nicht das Objekt selbst. Daher wirken sich Änderungen an der Referenz innerhalb der Methode nicht auf die ursprüngliche Zeichenfolge außerhalb der Methode aus.

Um dies zu korrigieren und die Änderung der Zeichenfolge zu ermöglichen, müssen wir die Referenz referenzweise mit dem Schlüsselwort „ref“ übergeben:

public static void TestI(ref string test)
Nach dem Login kopieren

Alle Änderungen an der Referenz innerhalb der TestI-Methode werden jetzt in der Originalzeichenfolge außerhalb der Methode widergespiegelt.

Es ist wichtig, den Unterschied zwischen der Änderung des Objekts, auf das eine Variable verweist, und der Änderung der Referenz selbst zu beachten. Zeichenfolgen sind unveränderlich, was bedeutet, dass ihr Inhalt nicht geändert werden kann. Wir können die Referenzvariable jedoch neu zuweisen, um auf eine andere Zeichenfolge zu verweisen, wie im folgenden StringBuilder-Beispiel gezeigt:

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");
    }
}
Nach dem Login kopieren

In diesem Beispiel ändern wir nicht den Wert des Parameters „test“, sondern die Daten in dem Objekt, auf das er sich bezieht.

Das obige ist der detaillierte Inhalt vonWarum scheint das C#-String-Verhalten der Referenztypklassifizierung zu widersprechen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage