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中文網其他相關文章!