Heim > Backend-Entwicklung > C++ > Warum scheint sich der String-Referenztyp von C# wie ein Werttyp zu verhalten, wenn er an eine Methode übergeben wird?

Warum scheint sich der String-Referenztyp von C# wie ein Werttyp zu verhalten, wenn er an eine Methode übergeben wird?

DDD
Freigeben: 2025-01-24 07:06:10
Original
624 Leute haben es durchsucht

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

Steht der String-Referenztyp in C# im Widerspruch zum Codeverhalten?

In C# sind Zeichenfolgen Referenztypen, wie von MSDN dokumentiert. Der folgende Code wirft jedoch ein verwirrendes Problem auf, das dieses Konzept in Frage zu stellen scheint:

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

Abhängig vom Verhalten der Referenztypen würde man erwarten, dass die Konsole „vor der Übergabe“ und dann „nach der Übergabe“ ausgibt. Dies liegt daran, dass die Zeichenfolge test als Referenz an die Methode TestI übergeben wird und alle an der Zeichenfolge innerhalb dieser Methode vorgenommenen Änderungen an den Aufrufer zurückgespiegelt werden sollten.

Der Code führt jedoch tatsächlich zu der Ausgabe: „vor der Übergabe“ „vor der Übergabe“, was anzeigt, dass die Zeichenfolge als Wert übergeben wird. Dieses Verhalten widerspricht dem dokumentierten Referenztyp für Zeichenfolgen in C#.

Missverständnis: Pass-by-Reference vs. Pass-by-Reference

Die Verwirrung entsteht durch den subtilen Unterschied zwischen der Übergabe einer Referenz als Wert und der Übergabe eines Objekts als Referenz. In C# werden Parameter immer als Wert übergeben, unabhängig von ihrem Datentyp.

Wenn ein Referenztyp an eine Methode übergeben wird, ist der übergebene Wert selbst eine Referenz, daher der Begriff „Übergabe als Referenz“. Dies bedeutet jedoch nicht, dass das von der Variablen referenzierte Objekt auch als Referenz übergeben wird.

Im obigen Beispiel ist der an die TestI-Methode übergebene Wert eine Kopie des Verweises auf die Zeichenfolge „before pass“. Alle an dieser Kopie der Referenz innerhalb der Methode vorgenommenen Änderungen wirken sich nicht auf die ursprüngliche Referenz außerhalb der Methode aus.

Referenz durch Referenz übergeben: ref-Schlüsselwort

Um einen Referenztyp tatsächlich als Referenz zu übergeben, muss das Schlüsselwort ref verwendet werden. Dieses Schlüsselwort gibt an, dass der Parameter ein Verweis auf eine vorhandene Variable ist und alle innerhalb der Methode am Parameter vorgenommenen Änderungen in der Originalvariablen widergespiegelt werden.

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

Durch die Einbeziehung des Schlüsselworts ref wird der Code nun wie erwartet ausgeführt und gibt „vor der Übergabe“ und „nach der Übergabe“ aus, da die TestI-Methode die ursprüngliche Zeichenfolge ändert, auf die die Variable test verweist.

Das obige ist der detaillierte Inhalt vonWarum scheint sich der String-Referenztyp von C# wie ein Werttyp zu verhalten, wenn er an eine Methode übergeben wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage