gpt4 book ai didi

c# - String 是引用类型,但是当我们将它作为参数传递给函数时,它作为值类型工作,为什么?

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

我有以下代码片段。当我将字符串 strMain 传递给 foo 方法并打印它时,我得到“main”字符串,如果字符串是引用类型,那么为什么它打印“main”而不是“local”。当我通过使用 ref 关键字传递它来做同样的事情时,它就起作用了。 string 是引用类型,那么这里为什么需要 ref 关键字。

void main()
{
string strMain="main"
foo(string str);
Console.WriteLine(strMain);
}
void foo(string strFoo )
{
strFoo="Local";
}

最佳答案

这样做的原因是您正在传递 strFoo按值,而不是按引用。重新分配 strFoo里面foo到一个新的stringstrMain 没有影响来自 main .这不是特定于 string : C# 中的所有引用类型都以这种方式工作。

如果你想在foo中赋值在 main 中可见,通过引用传递您的字符串:

public void Main(string[] args) {
string strMain="main";
Foo(ref strMain);
Console.WriteLine(strMain);
}
void Foo(ref string strFoo) {
strFoo="Local";
}

请注意,按值传递引用类型允许被调用的方法更改您传递的变量的值,只要该变量可变。这不能用 string 完成因为它是不可变的,但你可以用 StringBuilder 来做到这一点:

public void Main(string[] args) {
StringBuilder strMain=new StringBuilder();
Foo(strMain);
Console.WriteLine(strMain);
}
void Foo(StringBuilder strFoo) {
strFoo.Append("Local");
}

这是一个例子:

Pass by value vs. pass by reference.

关于c# - String 是引用类型,但是当我们将它作为参数传递给函数时,它作为值类型工作,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29626742/

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