gpt4 book ai didi

C# 字符串引用类型?

转载 作者:IT王子 更新时间:2023-10-29 03:31:16 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com