首頁 > 後端開發 > C++ > 為什麼不修改C#方法中的字符串更改原始字符串?

為什麼不修改C#方法中的字符串更改原始字符串?

Patricia Arquette
發布: 2025-01-24 07:11:09
原創
216 人瀏覽過

Why Doesn't Modifying a String in a C# Method Change the Original String?

深入理解 C# 中字串的傳遞

C# 中的字串是引用類型,但這常常導致誤解。本文將深入探討字串傳遞的細微之處,解釋為何如下程式碼的行為並非預期那樣:

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

雖然字串是引用型,但這段程式碼的第二次輸出並未改變。這是因為區分了按值傳遞引用和按引用傳遞物件。

按值傳遞引用是指複製引用本身,方法內部的任何變更都不會影響原始變數。而依引用傳遞物件則會改變引用本身,方法內部的修改會反映到原始變數。

要讓字串如預期運作,需要按引用傳遞(使用 ref 關鍵字):

using System;

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>输入:before passing
输出:after passing</code>
登入後複製

這與修改底層物件不同。 C# 中的字串是不可變的,其內容無法變更。但是,我們可以按引用傳遞一個物件(例如 StringBuilder)並修改其資料:

using System;
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" 参数的值。
        // 我们改变的是它所引用的对象中的数据。
        test.Append("changing");
    }
}
登入後複製

這段程式碼的輸出為:

<code>输入:
输出:changing</code>
登入後複製

總之,理解按值傳遞參考和按引用傳遞物件的區別對於處理 C# 中的字串至關重要。透過採用合適的方法,可以實現程式碼的預期行為。

以上是為什麼不修改C#方法中的字符串更改原始字符串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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