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

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

Linda Hamilton
發布: 2025-01-24 07:16:09
原創
392 人瀏覽過

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

C# 字串的「引用型別」異常

C# 文件中說明字串是引用型別。但是,下面的程式碼展示了令人困惑的行為:

<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>
登入後複製

根據引用類型的定義,輸出應為“before passing”和“after passing”,這表示字串在 TestI 方法中被修改了。但是,實際輸出為“before passing”和“before passing”,這表示字串是按值傳遞而不是按引用傳遞。

要理解這種異常,我們需要深入探討引用類型的細微之處。雖然字串在技術上是引用類型,但引用本身是按值傳遞的。按值傳遞引用意味著包含引用的變數被複製,而不是物件本身。因此,在方法內部對引用的任何變更都不會影響方法外部的原始字串。

為了修正這個問題並允許修改字串,我們需要使用「ref」關鍵字按引用傳遞參考:

<code class="language-csharp">public static void TestI(ref string test)</code>
登入後複製

現在,在 TestI 方法內部對引用的任何變更都將反映在方法外部的原始字串中。

重要的是要注意更改變數所引用的物件和更改引用本身之間的區別。字串是不可變的,這意味著它們的內容不能被修改。但是,我們可以重新分配引用變數以指向不同的字串,如下面的 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("changing");
    }
}</code>
登入後複製

在這個例子中,我們不是更改「test」參數的值,而是更改它所引用的物件中的資料。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板