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中文网其他相关文章!