我知道 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/