gpt4 book ai didi

c# - .NET 字符串和引用类型参数

转载 作者:太空宇宙 更新时间:2023-11-03 17:11:46 27 4
gpt4 key购买 nike

下面的代码是如何工作的?

public void SomeMethod()
{
StringBuilder sb = new StringBuilder();
AppendFoo(sb);
String foo = sb.ToString(); // foo is "foo"

String s = String.Empty;
AppendBar(s);
String bar = s; // bar is empty
}

public void AppendFoo(StringBuilder x)
{
x.Append("Foo");
}

public void AppendBar(String x)
{
x = x + "Bar";
}

如果 StringBuilderString 都是引用类型,为什么字符串对象在通过 AppendBar 方法传递时没有改变,而将 StringBuilder 对象传递给 AppendFoo 方法时会发生变化,因为方法的两个参数都采用引用类型作为参数?

最佳答案

暂时忽略字符串不可变这一事实 - 这有点转移注意力。重要的一点是:

x.Append(...);

x = x + ...;

仔细观察它们:第一个正在作用于 x 引用的对象,更改StringBuilder 的内容。第二个是更改 x 的值以引用不同的对象(新字符串)。它不会更改现有对象的内容。 (事实上​​不能因为字符串是不可变的,但同样的逻辑无论如何都适用。)

在方法中更改 x 的值不会更改用于初始化 x 的参数的值。

关键点是区分更改变量的值和更改它所引用的对象的内容。一旦您了解了差异,其余部分就应该就绪。

my article on parameter passing 中阅读有关此内容和参数的更多信息,以及更多关于引用类型与值类型的信息,请参见 another article .

关于c# - .NET 字符串和引用类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1776256/

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