深入理解 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>
虽然字符串是引用类型,但这段代码的第二次输出并未改变。这是因为区分了按值传递引用和按引用传递对象。
按值传递引用是指复制引用本身,方法内部的任何更改都不会影响原始变量。而按引用传递对象则会改变引用本身,方法内部的修改会反映到原始变量。
要使字符串按预期工作,需要按引用传递(使用 ref
关键字):
<code class="language-csharp">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>
修改后的代码输出如下:
<code>输入:before passing 输出:after passing</code>
这与修改底层对象不同。C# 中的字符串是不可变的,其内容无法更改。但是,我们可以按引用传递一个对象(例如 StringBuilder
)并修改其数据:
<code class="language-csharp">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>
这段代码的输出为:
<code>输入: 输出:changing</code>
总之,理解按值传递引用和按引用传递对象的区别对于处理 C# 中的字符串至关重要。通过采用合适的方法,可以实现代码的预期行为。
以上是为什么在 C# 方法中修改字符串不会更改原始字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!