字符串是引用类型,但是当我们将它作为参数传递给函数时,它作为值类型的原因是什么?

时间:2015-04-14 12:00:46

标签: c#

我有以下代码段。当我将字符串strMain传递给foo方法并打印它然后我得到" main" string,如果string是引用类型,那么为什么它打印" main"不是"当地"。当我通过使用ref关键字传递它做同样的事情然后它工作。 string是引用类型,那么为什么它需要ref关键字。

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

1 个答案:

答案 0 :(得分:1)

这样做的原因是你按值传递strFoo,而不是通过引用。将strFoo内的foo重新分配给新的string不会对来自strMain的{​​{1}}产生任何影响。这不是main特有的:C#中的所有引用类型都以这种方式工作。

如果您想在string中显示foo中的作业,请通过引用传递您的字符串:

main

请注意,按值传递引用类型允许调用的方法更改传递的变量的值,只要该变量是 mutable 即可。这不能用public void Main(string[] args) { string strMain="main"; Foo(ref strMain); Console.WriteLine(strMain); } void Foo(ref string strFoo) { strFoo="Local"; } 来完成,因为它是不可变的,但您可以使用string执行此操作:

StringBuilder

以下是插图:

Pass by value vs. pass by reference.