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