首页 > 后端开发 > C++ > 为什么在 C# 方法中修改字符串不会更改原始字符串?

为什么在 C# 方法中修改字符串不会更改原始字符串?

Patricia Arquette
发布: 2025-01-24 07:11:09
原创
203 人浏览过

Why Doesn't Modifying a String in a C# Method Change the Original String?

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

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