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