C# 字符串引用类型?

标签 c# string reference types

我知道 C# 中的“string”是引用类型。这是在 MSDN 上。但是,此代码无法正常工作:

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";
    }
}

输出应该是“传递前”和“传递后”,因为我将字符串作为参数传递并且它是引用类型,第二个输出语句应该识别出在 TestI 方法中更改的文本。但是,我得到“通过之前”“通过之前”,看起来它是按值而不是按 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";
    }
}

现在您需要区分是对引用所引用的对象进行更改,还是对变量(例如参数)进行更改以使其引用不同的对象。我们无法更改字符串,因为字符串是不可变的,但我们可以使用 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)
    {
        // Note that we're not changing the value
        // of the "test" parameter - we're changing
        // the data in the object it's referring to
        test.Append("changing");
    }
}

参见 my article on parameter passing了解更多详情。

关于C# 字符串引用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1096449/

相关文章:

c# - 在global.asax Application_Start中缓存大量数据,windows azure角色

c++ - 无法成功比较字符串

c++ - 仅使用标准库创建 "Vector of References"的标准实践

c# - Visual Studio 2010 安装项目中的 "Runtime Implementation from ASSEMBLE NAME"是什么? (vs 2015 中的安装程序扩展设置项目)

c# lambda 表达式根据不同列表中的给定条件从列表中删除项目

python - 按独特模式拆分字符串

C++:如何在复杂的模板类中指定线程函数?

c++ - 工作范围究竟如何?

C# 不安全值类型数组到字节数组的转换

java - 在java文件中使用超链接