首頁 >後端開發 >C++ >為什麼 C# 字串行為似乎與其引用型別性質相矛盾?

為什麼 C# 字串行為似乎與其引用型別性質相矛盾?

Linda Hamilton
Linda Hamilton原創
2025-01-24 06:56:10660瀏覽

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

C# 字串在某些情況下為何不像引用型別那樣運作?

儘管在 C# 中字串被定義為引用類型,但在某些程式碼場景中,它的行為卻有所不同。考慮以下程式碼:

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

這段程式碼的預期輸出是“傳遞前”和“傳遞後”,反映了字串的引用特性。然而,實際輸出卻是兩行都是“傳遞前”,這表明是值傳遞而不是引用傳遞。

這種差異的原因在於 C# 中引用處理的方式。字串類型確實是一種參考類型,但是當引用作為參數傳遞給方法時,它是按值傳遞的。這意味著創建的是引用的副本,而不是對原始值的引用。

如果要按引用傳遞字串,必須使用「ref」關鍵字:

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

這確保了方法接收對原始字串的引用,允許在方法中進行的修改反映在呼叫程式碼中。

區分更改引用物件的 值 和更改引用本身至關重要。字串是不可變的,不能修改,但可以將引用重新指派給不同的字串。

為了更清晰地演示,讓我們使用一個涉及可變類型的不同範例,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>

在這種情況下,輸出將是“”和“修改”,這表明在方法中進行的修改反映在呼叫程式碼中。這是因為 StringBuilder 是一個可變的引用類型。

以上是為什麼 C# 字串行為似乎與其引用型別性質相矛盾?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn