首页 > 后端开发 > C++ > 为什么 C# 字符串行为似乎与其引用类型分类相矛盾?

为什么 C# 字符串行为似乎与其引用类型分类相矛盾?

Linda Hamilton
发布: 2025-01-24 07:16:09
原创
395 人浏览过

Why Does C# String Behavior Seem to Contradict its Reference Type Classification?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板